【问题标题】:Unexpected results when subtracting milliseconds in SQL [duplicate]在 SQL 中减去毫秒时出现意外结果 [重复]
【发布时间】:2019-04-12 10:53:25
【问题描述】:

我正在尝试在 SQL 中执行一些 DateTime 逻辑:

SET @DayEnd = DATEADD(MILLISECOND, -1, @BeginNextDay)

例如,如果 @BeginNextDay 是 '2019-02-04 00:00:00.000' 并且我正在执行上面的代码,我希望 @DayEnd 是 '2019-02-03 29:59:59 :999'。不幸的是,事实并非如此,结果是“2019-02-04 00:00:00.000”。

当我减去 12 毫秒时,结果是“2019-02-03 23:59:59.987”。

当我减去 10 毫秒时,结果如预期的那样是 '2019-02-03 23:59:59.990'。

有人可以向我解释一下 SQL 正在做什么,这给了我这个(对我而言)意想不到的结果吗?

【问题讨论】:

  • 旧的DateTime 精确到只有3毫秒。这就是为什么它可以工作 10 毫秒,但不能工作 1 毫秒。
  • 我认为这取决于时间戳数据类型的实现。我知道使用 double 作为日期时间的系统:整数部分是日期,其余的是时间。这种方法缺乏精确毫秒所需的精度......
  • 首先,不要这样做。其次,如果您想查看某个时间是否属于某个日期,只需使用date 类型,例如WHERE cast(TransactionTime as date)=@someDateTypedParameter。 SQL Server 足够聪明,可以将这种转换转换为等同于TransactionTime > @someDate AND TransactionTime < dateadd(day,1,@someDate)的范围搜索
  • 也许this 可以对此有所了解

标签: sql sql-server


【解决方案1】:

别这样!只需使用:

SET @DayEnd = @BeginNextDay;  -- if you even need this

并将您的逻辑更改为:

WHERE datecol < @DayEnd

而不是:

WHERE datecol <= @DayEnd  -- or equivalently using BETWEEN

不要摆弄毫秒来定义时间段。使用&gt;=&lt; 定义周期。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-27
    • 1970-01-01
    • 2013-10-25
    • 1970-01-01
    • 1970-01-01
    • 2012-08-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多