【问题标题】:Using a CASE in a WHERE clause with BETWEEN [duplicate]在带有 BETWEEN 的 WHERE 子句中使用 CASE [重复]
【发布时间】:2019-06-04 09:39:47
【问题描述】:

我正在尝试使用 case 语句编写 where 子句,该语句将查看 @TimeType,然后仅返回这些时间范围之间的行。所以基本上我有3次(早上,下午和晚上)。我在使用 between 时遇到语法错误。 start_time 字段是 sql 时间数据类型。到目前为止,这是我所拥有的:

declare @TimeType int

select * from events
where
start_time = case 
when @TimeType = 0 then start_time between '00:00:00' and '11:59:00' 
when @TimeType = 1 then start_time between '12:00:00' and '16:59:00' 
when @TimeType = 2 then start_time between '17:00:00' and '23:59:00' 
end

【问题讨论】:

    标签: sql sql-server tsql


    【解决方案1】:

    只需使用常规逻辑:

    select e.* 
    from events e
    where (@TimeType = 0 and start_time between '00:00:00' and '11:59:00') or
          (@TimeType = 1 then start_time between '12:00:00' and '16:59:00') or 
          (@TimeType = 2 then start_time between '17:00:00' and '23:59:00');
    

    一般来说,不鼓励在where 子句中使用case 表达式,因为它会阻碍优化器。 . .而且可能更难遵循。通常,相同的逻辑可以用基本的布尔逻辑来表示。

    【讨论】:

      【解决方案2】:

      您可以在WHERE 子句中使用布尔逻辑:

      WHERE (@TimeType = 0 AND start_time between '00:00:00' and '11:59:00') OR
            (@TimeType = 1 AND start_time between '12:00:00' and '16:59:00') OR
            (@TimeType = 2 AND start_time between '17:00:00' and '23:59:00')   
      

      【讨论】:

        猜你喜欢
        • 2023-03-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多