【问题标题】:Date conversion issue in SQL Server 2012SQL Server 2012 中的日期转换问题
【发布时间】:2016-09-22 23:48:15
【问题描述】:

我正在尝试将数值转换为日期。我在下面的答案中找到了它

SELECT CONVERT(DATETIME, CONVERT(FLOAT, 41547))

我得到的输出是 2013-10-02 00:00:00.000

但是,如果我在 excel 中检查 41547 的日期值,它会给我 2013-09-30,这比我在 SQL Server 中得到的要少 2 天。

请帮助我理解这种转换。
如何获得 2013-09-30 而不是 2013-10-02 的号码 41547

【问题讨论】:

  • 这可能是因为您将值转换为float,这是一个近似数据类型。如果你改为使用integer,你会得到什么?
  • 我忘了修改,我使用 float 和 int 都给了我相同的结果。
  • 你是对的,我得到了相同的结果,也适用于 excel。我不知道 excel 是如何进行转换的,但我更相信 sql-server...

标签: sql-server date datetime sql-server-2012


【解决方案1】:

Excel 将 01/00/1900(即 12/31/1899)视为对应于 0,并将 1900 年错误地视为闰年。因此,对于 1900 年 3 月 1 日之前的日期,Excel 数字实际上是 1899 年 12 月 31 日之后的天数。

Excel 不会格式化任何低于 0 的数字(-1 为您提供##########),因此这只对“01/00/1900”至 02/28/1900 很重要,使其更容易仅使用 12/30/1899 日期作为基础。

来自此的参考 post

因此,在您的 SQL Server 中,您需要从 12/30/1899 中添加天 (在您的情况下为 41547),如下所示,它会给出相同的结果结果是从 excel 中返​​回的。

SELECT DATEADD(DAY, 41547, '1899-12-30')  

结果为 2013-09-30 00:00:00.000

如果您不希望结果中出现时间戳,并且希望 excel 2013-09-30 具有相同的格式,请使用转换为

SELECT REPLACE(CONVERT(VARCHAR(10), DATEADD(DAY ,41547, '1899-12-30'), 111), '/', '-')

【讨论】:

  • 还有一个疑问是这个转换问题只存在于SQL服务器还是其他数据库也如oracle,mysql..???
  • @dreamer 请参考这里Oracle
猜你喜欢
  • 2019-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-30
  • 1970-01-01
  • 2013-11-18
相关资源
最近更新 更多