sql - 有没有一种有效的方法可以将日期范围分成每天几小时?
问题描述
在 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
谢谢,卡尔
解决方案
最好的方法是使用递归 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<>在这里摆弄
推荐阅读
- primefaces - 数据表不显示行选择
- filebeat - 带有条件的 filebeat add_fields 处理器
- javascript - 您可以直接使用设备的串行向接收器应用程序发送消息吗?
- python - pytest 基础知识。在目录中运行测试
- reactjs - 材质 UI 多选不同的代码值和可见值 - 显示键而不是值
- c - 返回字符串而不是 int
- r - 根据前一列中的值按比例填充新变量?
- javascript - 从 websocket 过滤 json 对象/值并打印到控制台日志
- microservices - 在分布式架构(微服务)中实现数据库原子性的模式指南和建议
- typescript - 打字稿:离开当前页面时如何处理打字(从不打字)?