You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL中结合日期与小时实现跨日期时段筛选的解决方案

解决跨天时段查询问题

这个问题的核心是当当前时间为0点时,前4小时属于前一天,而你的原SQL只限定了Date为当日,所以自然拿不到前一天的历史数据。另外,直接用DATEPART(HOUR, GETDATE())-n还会出现负数小时(比如0-4=-4),这在Hour字段里是不存在的,导致查询结果缺失。

最优解决方案:基于完整时间范围筛选

我们可以把表中的Date和Hour字段组合成完整的datetime值,然后直接筛选这个值落在「当前时间减4小时」到「当前时间加1小时」的区间内。这样不管是否跨天,都能精准匹配到需要的6个时段数据。

修改后的SQL如下:

SELECT 
    Hour as Saat, 
    DataX 
FROM CPS.dbo.CMM 
WHERE 
    -- 将Date和Hour拼接成完整的datetime
    DATEADD(HOUR, Hour, CAST(Date AS DATETIME)) 
    BETWEEN DATEADD(HOUR, -4, GETDATE()) AND DATEADD(HOUR, 1, GETDATE())
    AND PowerPlantName in ('X')

为什么这个方案可行?

  • 当当前时间是0点时,DATEADD(HOUR, -4, GETDATE())会自动指向前一天的20点,DATEADD(HOUR, 1, GETDATE())是当天的1点,刚好覆盖你需要的20、21、22、23、0、1这6个时段。
  • 当当前时间是其他时段(比如14点),这个范围就是10点到15点,和你原本的需求完全一致。
  • 避免了原SQL中负数小时的无效匹配,逻辑更严谨。

补充说明

如果你的表中本身有一个完整的datetime字段(比如记录数据生成时间的字段),那直接用这个字段做范围筛选会更高效,不需要拼接Date和Hour。但如果只有分开的Date和Hour,上面的写法就完全能满足需求。

内容的提问来源于stack exchange,提问作者uguryigit93

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 14:27:50