有没有一种有效的方法可以将日期范围分成每天几小时?
Posted
技术标签:
【中文标题】有没有一种有效的方法可以将日期范围分成每天几小时?【英文标题】:Is there an efficient way to break a date range into hours per day? 【发布时间】:2021-07-05 14:02:19 【问题描述】:在 SQL Server 中,我试图将日期范围分解为每天几小时,并使用以下代码在短时间内可以使用,但在较长时间内效率低下。有人可以提出更有效的方法吗?
DECLARE @StartDate datetime = '2015-01-27 07:32:35.000',
@EndDate datetime = '2015-04-29 14:39:35.000',
@TempDate datetime = '';
SET @TempDate = @StartDate;
DECLARE @dateTimeTable TABLE (dt datetime, minCol INT);
WHILE @TempDate < @EndDate
BEGIN
INSERT INTO @dateTimeTable VALUES (CONVERT(date,@TempDate), 1)
SET @TempDate = DATEADD(minute,1,@TempDate)
END
Select dt,
FORMAT(SUM(minCol) / 60.0,'F') as Hours
from @dateTimeTable
GROUP BY dt
谢谢, 卡尔
【问题讨论】:
我不明白你目前的代码:minCol
总是1
和dt
总是变化,那么分组和求和有什么意义呢?您要达到什么实际的最终结果:只是一个小时列表,还是您想加入另一个表?
我希望获取某个日期范围内每天的小时数或部分小时数。下面eshirvana给出的答案给了我我需要的东西。谢谢。
【参考方案1】:
最好的方法是使用递归 cte :
DECLARE @StartDate datetime = '2015-01-27 07:32:35.000',
@EndDate datetime = '2015-04-29 14:39:35.000';
WITH cte AS (
SELECT CAST(@StartDate AS DATE) startdate,DATEDIFF(minute, @StartDate, DATEADD(DAY, 1, CAST(@StartDate AS DATE) ) ) / 60.0 hours
UNION ALL
SELECT DATEADD(DAY,1, startdate), DATEDIFF(minute, DATEADD(DAY,1, startdate), CASE WHEN DATEADD(DAY,2, startdate) > @EndDate
THEN @enddate ELSE DATEADD(DAY,2, startdate) END) / 60.0
FROM cte
WHERE startdate <> CAST(@EndDate AS DATE)
)
SELECT * FROM cte
db小提琴here
【讨论】:
不会称它为 最好的,Itzik 的计数功能通常会执行得更好,并且不需要OPTION (MAXRECURSION 0)
,我注意到你没有输入跨度>
以上是关于有没有一种有效的方法可以将日期范围分成每天几小时?的主要内容,如果未能解决你的问题,请参考以下文章
有没有办法用两个日期之间的每小时日期时间有效地填充 python 中的 pandas df 列?