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

SQL Server按当前班次筛选数据:WHERE子句CASE逻辑修正

问题:根据当前时段筛选SQL Server对应班次数据

需要实现SQL Server查询,根据当前时段筛选对应班次的数据:日班标记为1(对应7-18点),夜班标记为0(对应0-6点、19-23点)。已通过CTE构建名为DATA的表,其中WhichShift字段标记各记录所属班次,但WHERE子句中的CASE逻辑存在问题,导致无论当前处于哪个班次,所有行都会被返回。请修正该逻辑,实现仅显示当前班次的行。

现有查询代码

WITH DATA as(
    select vwDateShift.*
        ,DateHour.DateTime
        ,DateHour.DateTimeEnd
        ,DateHour.Hour
        ,DateHour.HH
        ,DateHour.[HH:MM]
        ,DATEDIFF(Hour,DateTime,GETDATE()) as HoursAgo
        ,CASE
            WHEN hour <= 6 THEN 0
            WHEN hour >= 7 And hour <=18 THEN 1
            ELSE 0
         END AS WhichShift
        ,Case
            WHEN hour <= 6 Then ShiftNightPrev
            WHEN hour >= 19 Then ShiftNight
            ELSE ShiftDay
        end AS ShiftHour
    from PublicUtilities..vwDateShift
    Left Join PublicUtilities..DateHour on DateHour.Date = vwDateShift.Date
    )
    SELECT * 
    FROM DATA
    WHERE WhichShift = CASE
        WHEN DATEPART(HOUR, GETDATE()) = 1 THEN WhichShift
        WHEN DATEPART(HOUR, GETDATE()) = 2 THEN WhichShift
        WHEN DATEPART(HOUR, GETDATE()) = 3 THEN WhichShift
        ...
        END

数据示例

Date Time                  HH  WhichShift
-----------------------     --  -----------
2000-01-06 04:00:00.000     04  0
2000-01-06 05:00:00.000     05  0
2000-01-06 06:00:00.000     06  0
2000-01-06 07:00:00.000     07  1
2000-01-06 08:00:00.000     08  1
2000-01-06 09:00:00.000     09  1

问题分析与修正

原WHERE子句的CASE逻辑错误:无论当前时段是什么,CASE的返回值都是WhichShift本身,导致WhichShift = WhichShift永远成立,所以会返回所有行。

正确的逻辑应该是先根据当前时间计算出对应的班次标记(1或0),再筛选DATA表中WhichShift等于该标记的行。修正后的完整查询如下:

WITH DATA as(
    select vwDateShift.*
        ,DateHour.DateTime
        ,DateHour.DateTimeEnd
        ,DateHour.Hour
        ,DateHour.HH
        ,DateHour.[HH:MM]
        ,DATEDIFF(Hour,DateTime,GETDATE()) as HoursAgo
        ,CASE
            WHEN hour <= 6 THEN 0
            WHEN hour >= 7 And hour <=18 THEN 1
            ELSE 0
         END AS WhichShift
        ,Case
            WHEN hour <= 6 Then ShiftNightPrev
            WHEN hour >= 19 Then ShiftNight
            ELSE ShiftDay
        end AS ShiftHour
    from PublicUtilities..vwDateShift
    Left Join PublicUtilities..DateHour on DateHour.Date = vwDateShift.Date
    )
    SELECT * 
    FROM DATA
    WHERE WhichShift = 
        CASE 
            WHEN DATEPART(HOUR, GETDATE()) BETWEEN 7 AND 18 THEN 1
            ELSE 0
        END

逻辑说明

  • 当当前时间的小时数在7到18之间时,CASE返回1,筛选出WhichShift=1的日班数据
  • 其他时段(0-6点、19-23点)CASE返回0,筛选出WhichShift=0的夜班数据

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 02:10:33