【问题标题】:Using case expression in DATEADD interval在 DATEADD 间隔中使用 case 表达式
【发布时间】:2015-09-18 08:46:33
【问题描述】:

是否可以在 DATEADD 间隔参数中使用 case 表达式?

select DATEADD(case c1 when 1 then HOUR when 2 then DAY end, c2, date) from T

Update1:对不起,我想在 where 子句中使用它

select * from T where DATEADD(case c1 when 1 then HOUR when 2 then DAY end, c2, date) < GETDATE()

也许还有其他选择。

提前致谢,

【问题讨论】:

  • 试试这个 - select case c1 when 1 then DATEADD(HOUR, c2, date) when 2 then DATEADD(DAY, c2, date) end from T
  • 我猜不是。但为什么不试试呢?
  • @KrishnrajRana 它认为它应该可以工作,但它想在 where 子句中使用 DATEADD。我正在更新示例
  • @fravelgue 我已经发布了一个答案..你可以试一试..

标签: sql sql-server case dateadd


【解决方案1】:

试试下面..

select * from T 
where case c1 when 1 then DATEADD(HOUR, c2, date) 
when 2 then DATEADD(DAY, c2, date) 
end < Getdate()

【讨论】:

    【解决方案2】:

    不,你不能参数化DATEADDdatepart参数:

    下表列出了所有有效的 datepart 参数。用户定义的等效变量无效。

    你必须使用两个不同的DATEADD 表达式,或者改变你的逻辑:

    select DATEADD(hour, c2 * case c1 when 1 then 1 when 2 then 24 end, date) from T
    

    【讨论】:

    • 感谢 Damien,我已经更新了新示例。我阅读了 MSDN,并且正在寻找替代解决方案
    【解决方案3】:

    不用CASE也可以查询

    select * from T 
    where c1=1 AND DATEADD(hour, c2, date) < getdate()
    or c1=2 AND DATEADD(day, c2, date) < getdate()
    

    【讨论】:

    • 大小写可以在 Where 子句中使用。阅读herehere .. 我对不正确的信息投了反对票...
    • 这里有一个SQLFiddle 供您参考。你也可以看到我对这个问题的回答......
    猜你喜欢
    • 1970-01-01
    • 2020-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多