如何在SQL Server中生成两小时之间的小时数?

问题描述 投票:2回答:3

我想生成一个小时到小时的小时列表,间隔为30分钟。

例如,员工在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

我怎样才能生成这个?谢谢。

sql sql-server time hour
3个回答
6
投票

使用递归CTE,您可以实现此结果。

尝试以下查询 -

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

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

2
投票

你也可以尝试while循环

DECLARE @strattime TIME = '09:00' DECLARE @endtime TIME = '18:00'

CREATE TABLE #tmp_hours( [BetweenHours] VARCHAR(5) )

WHILE @strattime <= @endtime BEGIN    INSERT INTO #tmp_hours values(@strattime)   SET @strattime = DATEADD(minute,30,@strattime) END

SELECT * FROM #tmp_hours DROP TABLE #tmp_hours
© www.soinside.com 2019 - 2024. All rights reserved.