【问题标题】:What does the number mean in this statement: DATEDIFF(wk, 6, '2020-01-03');此语句中的数字是什么意思: DATEDIFF(wk, 6, '2020-01-03');
【发布时间】:2020-05-01 08:13:33
【问题描述】:

文档说明

DATEDIFF(interval, date1, date2);  

我找不到任何关于数字含义的信息。

【问题讨论】:

  • 您使用的是哪个 dbms? (DATEDIFF 不是 ANSI SQL。)
  • 语法建议SQL Server DB。
  • 这意味着编写此代码的人采用了一些非常棘手的快捷方式。不幸的是,我相信您会发现更多。

标签: sql-server tsql datediff


【解决方案1】:

这意味着日期是“6”。如果你运行:

select convert(datetime,  6)

你会得到一个值。

我认为,更常见的是,这意味着编写代码的目的是 DATEADD() 而不是 DATEDIFF()

【讨论】:

    【解决方案2】:

    那句话说,周差:

    DATEDIFF(wk, 6, '2020-01-03')
    

    6 将是 1900-01-07

    因此,您将获得'1900-01-07' & '2020-01-03' 的周差

    当您传递数值时,它将被视为天数(添加到默认日期1900-01-01

    例如,如果你有一个数值1

    select convert(datetime, 1)
    

    你会得到1900-01-02 00:00:00.000,考虑到默认日期1900-01-01

    【讨论】:

      【解决方案3】:

      我相信代码

      SELECT DATEDIFF(WK, 6 , '20200103')
      

      实际上是从这个日期开始的:

      '1900-01-01 00:00:00.000'

      然后 6 在该日期上加上 6 天,使其成为 1 月 7 日。

      SELECT DATEDIFF(WK, '19000107', '20200103')
      

      运行这 2 个选择将输出相同的结果。

      【讨论】:

        【解决方案4】:

        旧版datetime 数据类型存储为两个串联在一起的 32 位整数。

        一个整数是基准日期 1900 年 1 月 1 日的偏移量,另一个整数是时间分量的刻度数。

        同样,SQL Server 长期以来一直允许在与此方案相对应的数字类型和日期时间之间进行强制转换。例如,整数 0 转换为星期一 1900-01-01,6 转换为星期日 1900-01-07。

        当您调用 DATEDIFF 并将整数作为最后 2 个参数之一传递时,它会隐式转换为 DATETIME,因此与 DATEDIFF(wk, {d '1900-01-07'}, date_under_test} 相同。

        虽然该表达式的输出本身可能并不有趣,但它可能用于将属于同一周(从星期日开始)的值组合在一起或与 DATEADD 组合以将此周数加一加到将下一个星期日的锚定日期发送到date_under_test 或类似的。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-11-18
          • 2011-08-15
          • 2012-05-07
          • 1970-01-01
          • 2023-03-12
          • 2014-04-13
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多