sql-server - SQL Server 显示某些行,并在 where 中包含大小写

标签 sql-server where-clause case date-arithmetic

我有一个 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/

相关文章:

sql - 查询单行中一个元素的父条目和子条目

mysql - 有没有更好的方法来构建具有广泛 WHERE 条件的 MySQL 查询?

php - 变量在 PHP joomla 的 where 子句中不起作用

r - 为什么 R 3.6.0 在评估表达式 ("Dogs"< "cats"时返回 FALSE )?

java - 菜单程序中的可变错误

php - 错误 ODBC MS SQL

node.js - NW.js/Node.js 使用 node-mssql 时抛出 "SSL routines:ssl_choose_client_version:unsupported protocol"错误/乏味

php - 我如何使用 CASE 语句循环遍历这些?

sql - 部署包含SQL Server数据库的应用程序。哪种认证方式?

sql - 使用 osql 运行查询