首页 > 解决方案 > SQL Server 查询中的三个 Shift 明智日期时间检查

问题描述

我在我的一个项目中检查 sql 查询时遇到问题。实际上,我必须根据 SHIFTNAME 获取记录,即关于日期的 firstshift、secondshift 和 thirdshift。

我们有以下班次时间,班次将采用 24 小时制

ShiftId   ShiftName       ShiftFrom    ShiftTo
-----------------------------------------------
   1      First Shift       07:00       12:00
   2      Second Shift      12:00       22:00
   3      Third Shift       22:00       07:00

我的问题是我在 shift1 和 shift2 中正确获取记录,但记录不在 shift3 中。我正在四处走动,以解决这个问题。我正在使用以下搜索查询来获取所有班次中的记录

select case when convert (varchar(5),GETDATE(),108) between (
  select ShiftFrom 
  from tbl_Shift_Master
  where ShiftId = 1
) and (
  select ShiftTo
  from tbl_Shift_Master
  where ShiftId = 2
) then 1 else 2 end as ShiftId

标签: sql-servertsqldatetime

解决方案


您可以在不将班次时间存储在变量中的情况下执行此操作,但对我来说似乎更清楚:

DECLARE @ST1_S TIME
       ,@ST1_E TIME
       --
       ,@ST2_S TIME
       ,@ST2_E TIME
       --
       ,@ST3_S TIME
       ,@ST3_E TIME;

SELECT @ST1_S = CASE WHEN ShiftId = 1 THEN ShiftFrom  ELSE @ST1_S END
      ,@ST1_E = CASE WHEN ShiftId = 1 THEN ShiftTo  ELSE @ST1_E END
      --
      ,@ST2_S = CASE WHEN ShiftId = 2 THEN ShiftFrom  ELSE @ST2_S END
      ,@ST2_E = CASE WHEN ShiftId = 2 THEN ShiftTo  ELSE @ST2_E END
      --
      ,@ST3_S = CASE WHEN ShiftId = 3 THEN ShiftFrom  ELSE @ST3_S END
      ,@ST3_E = CASE WHEN ShiftId = 3 THEN ShiftTo  ELSE @ST3_E END
FROM tbl_Shift_Master;


SELECT CASE 
            WHEN convert (varchar(5),GETDATE(),108) BETWEEN @ST1_S AND @ST1_E THEN  1
            WHEN convert (varchar(5),GETDATE(),108) BETWEEN @ST2_S AND @ST2_E THEN  2
            WHEN convert (varchar(5),GETDATE(),108) BETWEEN @ST3_S AND @ST3_E THEN  3
        END

推荐阅读