有没有一种有效的方法可以将日期范围分成每天几小时?

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 总是1dt 总是变化,那么分组和求和有什么意义呢?您要达到什么实际的最终结果:只是一个小时列表,还是您想加入另一个表? 我希望获取某个日期范围内每天的小时数或部分小时数。下面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 列?

Java计算两个日期时间相差几天,几小时,几分钟等

Java计算两个日期时间相差几天,几小时,几分钟等

如何给cookie设置有效时间为12小时

MySQL for Rails 在特定日期范围内每天获得 AVERAGE 的最佳方法

检查日期是不是对选定的月份有效 Django 表单