我有一个 SQL Server 查询,需要根据一天中的时间显示信息。我正在尝试根据类次(日类和夜类)选择行。
我有一个通用表,别名为 DATA,然后由于别名列的问题,我从 DATA 中进行选择...从那里我有一个 WHERE 子句,其中包含一个 CASE。该案例需要查看一天中的时间并获取当前小时,如果该小时在白类中,那么我只想显示白类行。如果那个时间是夜类,那么我只想显示夜类行。
白类用1表示
夜类用0表示
这是查询,我遇到的主要问题是第二个 SELECT...
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
CASE 内部有 24 个 WHEN 案例,但为了节省空间,我将它们排除在外,因为它们非常相似。
Date Time HH Which Shift
----------------------- -- -----------
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
该表排除了很多行,因为我认为它们与问题无关,只需询问您是否需要查看它们。
截至目前,无论当前处于哪个类次,每一行仍会显示。如何修复此问题以显示在当前类次上?
最佳答案
get the current hour, if that hour is in the day shift then I want to display only the day shift rows. If that hour is in the night shift then I want to display only the night shift rows.
据我了解这个问题,您只需应用用于计算列 WhichShift
到当前日期的相同逻辑即可。那将是(对您的 case
表达式进行一些简化):
with data as (...)
select *
from data
where whichShift = case when datepart(hour, getdate()) between 7 and 18 then 1 else 0 end
当一天中的当前小时在 7 点到 18 点之间时,case 表达式返回 1
,它会筛选 whichShift
列中的白类(反之亦然,筛选夜类) )。
关于sql-server - SQL Server 显示某些行,并在 where 中包含大小写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76574828/