【问题标题】:Why does converting a blank string to a date in SQL Server result in 1900-01-01? [duplicate]为什么在 SQL Server 中将空白字符串转换为日期会导致 1900-01-01? [复制]
【发布时间】:2017-10-02 14:04:08
【问题描述】:

运行SELECT CONVERT(date, '') 的简单T-SQL 查询将呈现1900-01-01 的结果。在我看来,将空白字符串转换为1753-01-01(允许的最小日期值)或NULL 会更加一致。 1900 看起来很随意,但我认为这是 MS SQL 程序员经过深思熟虑的设计选择。这个功能的目的是什么?

【问题讨论】:

  • 试试SELECT CONVERT(DATETIME, 0)——同样的结果。 DATETIME 的起始时代是 1900-01-01,更早的日期用负值表示。 Excel 使用相同;我敢肯定还有其他地方(我认为是 OLE DB/COM?)也有这个价值。作为一个不错的整数,它显然是处理两位数年份的方便起点(即在编写软件时的 20 世纪)。 DATETIME2 从 0001-01-01 开始,不过(但你不能直接将整数转换成那个,所以它不可见)。

标签: sql-server


【解决方案1】:

这是由于隐式转换。 sql server 中的 0 日期是 1/1/1900。任何早于该日期的日期都是负数。

【讨论】:

  • 不,它不会首先将字符串转换为 int —— CONVERT(DATETIME, '1') 失败,CONVERT(DATETIME, 1) 不会(同样,变得棘手,'0'0)。空字符串也会转换为 0,但其中一个不是另一个的结果。
  • @JeroenMostert 澄清的好点。
【解决方案2】:

SQL Server 日期时间日历的起点是 1900 年 1 月 1 日的开始日期。

https://stackoverflow.com/a/17071583/7974050

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-19
    • 1970-01-01
    • 1970-01-01
    • 2019-07-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多