首页 > 解决方案 > 有没有一种有效的方法可以将日期范围分成每天几小时?

问题描述

在 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

谢谢,卡尔

标签: sqlsql-serverperformancedatetime

解决方案


最好的方法是使用递归 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<>在这里摆弄


推荐阅读