【问题标题】:Avoid Seconds and milliseconds part from where condition避免条件的秒和毫秒部分
【发布时间】:2018-12-07 06:35:04
【问题描述】:

我正在使用下面的 sql 从 1 分钟前创建的表中获取记录

    SELECT Id,OrderNumber FROM ActivationRequest 
    WHERE Processed =0 AND 
    DateCreated <= DATEADD(minute,Convert(int,-1), GETDATE())

DateCreated :数据类型为 Datetime 的列,并且在插入具有秒和毫秒的长 datettime 值时被插入其中

在执行 selct 操作时,我们可以通过某种方式避免秒和毫秒部分吗?

示例:DateCreated 值 2018-12-07 07:08:41.703

但是当我在 2018-12-07 07:08:51.597 进行上述选择 sql 时,它返回了 0 条记录。由于日期时间的毫秒部分仅为 .597

那么我怎样才能避免秒和毫秒部分,而只需检查 where 条件中的小时和分钟部分。 我需要获取最后一分钟添加的所有记录,而不考虑秒和毫秒值

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    您可以四舍五入到最接近的分钟数:

    SELECT Id, OrderNumber
    FROM ActivationRequest 
    WHERE
        Processed = 0 AND 
        DateCreated <= DATEADD(mi, DATEDIFF(mi, 0, GETDATE()) + 1, 0);
    

    这是一个演示,展示了上面与 GETDATE() 一起使用的微积分背后的逻辑:

    Demo

    上面的查询应该有相当好的性能,因为它可以使用DateCreated上的索引。

    【讨论】:

    • 这只会四舍五入到下一分钟,我们怎样才能做到前一分钟
    • 对选择这种方法或 Ranjith 建议感到困惑。关于性能影响的任何建议
    • @JibinMathew FORMAT 往往表现不佳,但这对你来说真的很重要吗?
    • 2 没有从@Ranjith 中选择答案的原因主要是它会由于多种原因返回错误的结果,其次在比较时在列上使用格式会严重影响性能
    【解决方案2】:

    试试这个..

    SELECT Id, OrderNumber
    FROM ActivationRequest 
    WHERE
    Processed = 0 AND 
    FORMAT(DateCreated,'dd:mm:yyyy:hh:mm') = FORMAT(GETDATE(),'dd:mm:yyyy:hh:mm');
    

    【讨论】:

    • 这将返回任意结果。即使您将其修复为 和 dd:MM:yyyy:hh:mm 它也会返回错误的结果。 08:12:2017:09:51 不大于您的查询声称的 07:12:2018:09:51
    猜你喜欢
    • 2012-06-08
    • 1970-01-01
    • 1970-01-01
    • 2013-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-12
    相关资源
    最近更新 更多