【问题标题】:How to set date with hrs and minutes greater than given date?如何设置小时和分钟大于给定日期的日期?
【发布时间】:2018-10-18 10:53:44
【问题描述】:

我需要编写一个查询,返回所有包含小时和分钟的日期大于 5:30 的记录。示例:我们有日期:2018-10-18 03:00 和 2018-10-18 05:40。我只需要返回第二个。我现在正在做的是(在“选择”部分):

case
when DATEPART(hh,Table1.CreateDate)>05 and DATEPART(mi,Table1.CreateDate)>30 then 'late_status' end as Statuses

问题是我需要同时满足这两个条款。我也使用了括号,但它仍然不正确。基本上都不好用,问题出在哪里?

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    直接使用时间怎么样?

    where cast(Table1.CreateDate as time) >= '05:30:00'
    

    【讨论】:

    • @Muska 太好了 - 你能开始这样标记答案吗?这就是 SO 的设计方式。人们有问题,请在 SO 上寻找答案。标记答案有助于其他人找到它。
    • 是的,我把它标记为有用,还有别的吗?抱歉,我是该网站的新手
    【解决方案2】:

    就个人而言,如果可以的话(并且您需要大量基于时间的查询)我会将您的datetime 列的time 版本添加为PERSISTED 计算列并查询它。这保持了 SARGability。

    ALTER TABLE Table1 ADD CreateTime AS CONVERT(time, CreateDate);
    

    然后你就可以查询你的新列了:

    WHERE CreateTime >= '05:30:00'
    

    然后,您还可以将计算列添加到任何索引,或在其上创建或包含它。

    【讨论】:

      【解决方案3】:

      它将是 MINUTE 而不是 mi 并且您的查询也有效

      case
          when DATEPART(hh,Table1.CreateDate)=05 and DATEPART(MINUTE,Table1.CreateDate)>=30 then 'late_status' end as Statuses
      

      DEMO

      【讨论】:

      • @t-clausen.dk 请检查这个dbfiddle.uk/… 看看它工作正常
      • 您的代码在我的示例和问题中提供的数据上失败。它应该是 DATEPART(hh,Table1.CreateDate)=5 和 DATEPART(MINUTE,Table1.CreateDate)>30 或 DATEPART(hh,Table1.CreateDate)>5 如果你想通过你的解决方案
      • @t-clausen.dk 和你一起精确到 5.30,实际上我关注的是 OP 的主要问题,因为他错过了分钟并编辑了条件顺便说一句谢谢
      • 好的,谢谢,但我很好奇一件事,为什么 mi 不能用在 taht case 但全长 word minute 中?看这里:w3schools.com/sql/func_sqlserver_datepart.asp。理论上我可以在 Datepart 中使用 Minute、mi 和 n 来表示分钟。
      猜你喜欢
      • 2021-08-19
      • 1970-01-01
      • 2014-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多