如何在给定的持续时间内获得 15 分钟的块
How to get chunks of 15 minutes for the given time duration
我想在给定的持续时间内获取 15 分钟的块。
例如。 @start_time = '10:00 am'
@end_time = '1:00 pm'
那么它应该 return a table 像这样:
10:00 AM
10:15 AM
10:30 AM
10:45 AM
11:00 AM
11:15 AM
11:30 AM
11:45 AM
...and so on till
12:45 PM
我在 google 上搜索了很多,但没有找到任何有用的信息。我该怎么做?
或许您可以开始使用递归 CTE:
;WITH cte AS(
SELECT CAST('2018-01-01 10:00:00.000' AS DATETIME) AS StartDate
UNION ALL
SELECT DATEADD(MI, 15, StartDate)
FROM cte
WHERE StartDate < '2018-01-01 13:00:00.000'
)
SELECT *
FROM cte
OPTION (MAXRECURSION 32767)
注意:OPTION (MAXRECURSION 32767)
设置最大递归。省略此行,默认值为 100。
使用递归 CTE:
DECLARE @StartTime TIME = '10:00'
DECLARE @EndTime TIME = '13:00'
;WITH Recu AS
(
SELECT
GeneratedTime = @StartTime
UNION ALL
SELECT
GeneratedTime = DATEADD(MINUTE, 15, R.GeneratedTime)
FROM
Recu AS R
WHERE
R.GeneratedTime < @EndTime
)
SELECT
*
FROM
Recu AS R
OPTION
(MAXRECURSION 32000)
/*
Result:
GeneratedTime
10:00:00.0000000
10:15:00.0000000
10:30:00.0000000
10:45:00.0000000
11:00:00.0000000
11:15:00.0000000
11:30:00.0000000
11:45:00.0000000
12:00:00.0000000
12:15:00.0000000
12:30:00.0000000
12:45:00.0000000
13:00:00.0000000
*/
使用 Tally table:
DECLARE @Start_Time time = '10:00:00', @End_time time = '13:00:00';
SELECT DATEADD(MINUTE, Number, @Start_Time)
FROM Tally
WHERE Number % 15 = 0
AND DATEADD(MINUTE, Number, '1900-01-01' + CAST(@Start_Time As DateTime)) <
'1900-01-01' + CAST(@End_time As DateTime)
如果您还没有 Tally table,您可以使用此脚本创建它:
SELECT TOP 10000 IDENTITY(int,0,1) AS Number -- Note: Starts at 0!
INTO Tally
FROM sys.objects s1
CROSS JOIN sys.objects s2
ALTER TABLE Tally ADD CONSTRAINT PK_Tally PRIMARY KEY CLUSTERED (Number)
如果您不知道什么是计数 table 以及为什么您应该有计数,请阅读 Jeff Moden 的 The "Numbers" or "Tally" Table: What it is and how it replaces a loop
使用系统 table 制作行并 DATEADD
计算经期:
declare @start_time time = '10:00:00 AM', @end_time time = '01:00:00 PM';
select convert(time, dateadd(MINUTE, (n-1)*15, convert(datetime, @start_time))) x, *
from (select top (DATEDIFF(hh, @start_time, @end_time)*4) ROW_NUMBER() over (order by o1.object_id) n from sys.all_objects o1) num
非常快
我想在给定的持续时间内获取 15 分钟的块。
例如。 @start_time = '10:00 am'
@end_time = '1:00 pm'
那么它应该 return a table 像这样:
10:00 AM 10:15 AM 10:30 AM 10:45 AM 11:00 AM 11:15 AM 11:30 AM 11:45 AM ...and so on till 12:45 PM
我在 google 上搜索了很多,但没有找到任何有用的信息。我该怎么做?
或许您可以开始使用递归 CTE:
;WITH cte AS(
SELECT CAST('2018-01-01 10:00:00.000' AS DATETIME) AS StartDate
UNION ALL
SELECT DATEADD(MI, 15, StartDate)
FROM cte
WHERE StartDate < '2018-01-01 13:00:00.000'
)
SELECT *
FROM cte
OPTION (MAXRECURSION 32767)
注意:OPTION (MAXRECURSION 32767)
设置最大递归。省略此行,默认值为 100。
使用递归 CTE:
DECLARE @StartTime TIME = '10:00'
DECLARE @EndTime TIME = '13:00'
;WITH Recu AS
(
SELECT
GeneratedTime = @StartTime
UNION ALL
SELECT
GeneratedTime = DATEADD(MINUTE, 15, R.GeneratedTime)
FROM
Recu AS R
WHERE
R.GeneratedTime < @EndTime
)
SELECT
*
FROM
Recu AS R
OPTION
(MAXRECURSION 32000)
/*
Result:
GeneratedTime
10:00:00.0000000
10:15:00.0000000
10:30:00.0000000
10:45:00.0000000
11:00:00.0000000
11:15:00.0000000
11:30:00.0000000
11:45:00.0000000
12:00:00.0000000
12:15:00.0000000
12:30:00.0000000
12:45:00.0000000
13:00:00.0000000
*/
使用 Tally table:
DECLARE @Start_Time time = '10:00:00', @End_time time = '13:00:00';
SELECT DATEADD(MINUTE, Number, @Start_Time)
FROM Tally
WHERE Number % 15 = 0
AND DATEADD(MINUTE, Number, '1900-01-01' + CAST(@Start_Time As DateTime)) <
'1900-01-01' + CAST(@End_time As DateTime)
如果您还没有 Tally table,您可以使用此脚本创建它:
SELECT TOP 10000 IDENTITY(int,0,1) AS Number -- Note: Starts at 0!
INTO Tally
FROM sys.objects s1
CROSS JOIN sys.objects s2
ALTER TABLE Tally ADD CONSTRAINT PK_Tally PRIMARY KEY CLUSTERED (Number)
如果您不知道什么是计数 table 以及为什么您应该有计数,请阅读 Jeff Moden 的 The "Numbers" or "Tally" Table: What it is and how it replaces a loop
使用系统 table 制作行并 DATEADD
计算经期:
declare @start_time time = '10:00:00 AM', @end_time time = '01:00:00 PM';
select convert(time, dateadd(MINUTE, (n-1)*15, convert(datetime, @start_time))) x, *
from (select top (DATEDIFF(hh, @start_time, @end_time)*4) ROW_NUMBER() over (order by o1.object_id) n from sys.all_objects o1) num
非常快