2016-04-07 1 views
2

Я хочу создать список часов между часами с интервалом в 30 минут.Как создать часы между двумя часами в SQL Server?

Например работник вступает в работу в 09:00 и уходит в 18:00, так что я хочу, чтобы генерировать это:

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

Спасибо за ваш ответ, ваш код работает c orrectly. Я получаю этот результат: 09: 00: 00.0000000, как я могу получить этот формат: 09:00, спасибо –

+1

Лучше всего беспокоиться о форматировании в слое презентации. –

+1

@ Esraa_92: Я обновил свой ответ. Вы должны использовать 'CONVERT (VARCHAR (5), Hours, 108)' в инструкции select. Теперь вы получаете ожидаемый результат. –

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

Ваш код также работает правильно, спасибо :-) –

Смежные вопросы