2016-04-07 5 views
2

時間間隔を30分に設定して時間のリストを生成したいとします。SQL Serverで2時間の時間を生成するにはどうすればよいですか?

例えば従業員は09:00作業に入り、18時から出るので、私はこれを生成したい:

Hours 
----- 
09:00 
09:30 
10:00 
10:30 
11:00 
11:30 
12:00 
12:30 
13:00 
13:30 
14:00 
14:30 
15:00 
15:30 
16:00 
16:30 
17:00 
17:30 
18:00 

は、どのように私はこれを生成することができますか?ありがとう。

+0

はすべてあなたを表示テーブルからのデータ – Matt

答えて

5

再帰的なCTEを使用すると、この結果が得られます。クエリ以下

TRY -

DECLARE @timeFrom TIME = '09:00' 
DECLARE @timeTo TIME = '18:00' 

;with SourceHrs 
as 
(
    select @timeFrom as [Hours] 
    UNION ALL 
    SELECT DATEADD(MINUTE, 30, [Hours]) from SourceHrs WHERE [Hours] < @timeTo 
) 
SELECT CONVERT(VARCHAR(5),Hours,108) FROM SourceHrs 

結果

Hours 
------- 
09:00 
09:30 
10:00 
10:30 
11:00 
11:30 
12:00 
12:30 
13:00 
13:30 
14:00 
14:30 
15:00 
15:30 
16:00 
16:30 
17:00 
17:30 
18:00 
+0

あなたのコードはあなたの答えをありがとう正しく。私はこの結果を得ます:09:00:00.0000000、どのようにしてこのフォーマットを得ることができます:09:00、ありがとう –

+1

プレゼンテーションレイヤーでの書式設定について心配しないでください。 –

+1

@ Esraa_92:答えを更新しました。 SELECTステートメントで 'CONVERT(VARCHAR(5)、Hours、108)'を使用する必要があります。これで、期待される出力が得られます。 –

4

これは、集計を使用すると、再帰的よりも高速で、あなたが必要なものを与える:

DECLARE @from time = '09:00' 
DECLARE @to time = '09:00' 

IF @from <= @to 
WITH N(N)AS 
(SELECT 1 FROM(VALUES(1),(1),(1),(1),(1),(1),(1))M(N)), 
tally(N)AS(SELECT ROW_NUMBER()OVER(ORDER BY N.N)FROM N,N a) 
SELECT top (datediff(minute, @from, @to)/ 30 + 1) 
    LEFT(dateadd(minute, (N - 1)*30, @from), 5) 
FROM tally 
+0

あなたのコードは、私にとっても正しく動作します。 –

関連する問題