【问题标题】:Difference between datetime converts in MSExcel and SQL ServerMSExcel 和 SQL Server 中日期时间转换的区别
【发布时间】:2014-05-20 12:33:53
【问题描述】:

我今天在 excel 中将日期时间转换为文本并使用它生成的数字在 SQL Server 中转换为日期时间时发现了一些非常奇怪的东西。

这有什么奇怪的?结果不同。准确地说是两天的差异。

我在 Excel 中假设今天的日期 (20/05/2014 dd/MM/yyyy ) 并得到 41779 作为文本结果。

我得到了文本值,我使用 SQL 转换为 datetime 来检索值作为日期,但我没有得到我想要的结果。

我什至用datetime2 进行了测试,但我发现我无法将int 转换为datetime2

我既不是 MS Excel 专家也不是 SQL Server 专家,但这是怎么回事?我可以通过 MS Excel 生成的数字并删除 2 来使其工作,但对我来说仍然没有意义。

【问题讨论】:

  • 呵呵比较Select Cast(0 as DateTime)与=DATEVALUE("1900-01-01")和find the one extra leap year
  • 相差 1,但为什么这些测试之间有两天的差异?
  • 现在我看到了您的编辑,这很有意义。但真的是微软吗?该死。如果您可以将其发布为 awnser,我将标记为答案。谢谢。
  • 技术上是正确的,这不是微软的错误。这是微软“继承”的 IBM 错误,并且意识到但希望能够转换 Lotus 电子表格,请参阅 better explanation

标签: sql sql-server excel datetime


【解决方案1】:

呵呵 ;) 一天前,我想知道同样的事情......做一个简单的练习:

比较 Select Cast(0 as DateTime) 与 =DATEVALUE("1900-01-01") 这解释了 1 天的差异

并通过阅读father of VBA, Joel Spolsky, explanation找到额外的闰年

tl;博士

查看差异 - 说明第二天

=DateValue("1900-02-28") 和 =DateValue("1900-03-01")

【讨论】:

    【解决方案2】:

    特别关注 DATETIME,允许从 int 进行强制转换,导致差异的原因有两个。

    1. Excel 使用以 1 为底的日期,SQL Server 使用 0,即01/01/1900 在 Excel 中转换为数字时为 1,然而,在 SQL 中为 0:SELECT CAST(CAST('19000101' AS DATETIME) AS INT); 将给出 0。

    2. Excel 中有一个故意的错误,以允许从 Lotus 进行移植,而该错误不是故意的*。 Excel 将 1900 年 2 月 29 日视为有效日期,但 1900 年不是闰年。 SQL 没有这个问题,所以这意味着 excel 日历中多了一天。

    *(对此的进一步阅读表明它可能是故意的,或被认为无关紧要)


    附录

    有一个Microsoft Support Item 表示:

    当 Lotus 1-2-3 首次发布时,程序假定 1900 年是闰年,尽管它实际上不是闰年。这使得程序更容易处理闰年,并且对 Lotus 1-2-3 中的几乎所有日期计算没有任何损害。

    当 Microsoft Multiplan 和 Microsoft Excel 发布时,他们还假设 1900 年是闰年。这种假设允许 Microsoft Multiplan 和 Microsoft Excel 使用 Lotus 1-2-3 使用的相同序列日期系统,并提供与 Lotus 1-2-3 的更大兼容性。将 1900 年视为闰年也使用户更容易将工作表从一个程序移动到另一个程序。

    【讨论】:

    • 我真希望我也能将此标记为正确答案。
    【解决方案3】:

    我搜索了这个网站并找到了解决方案,请查看此处的代码。 您需要检查任何小于 60 的数字,如果小于 60,请不要减去 1,因为您还没有进入 bug。如果它结束了,由于 1900 年 2 月 29 日的错误,您必须从日期中减去一个

    声明@days INT = 41779

    声明@StartDate DATETIME = '1899-12-31'

    如果 (@days > 59) SET @days = @days -1 ;

    选择 DATEADD(天,@days,@StartDate)

    这是我找到解决方案的地方https://stackoverflow.com/a/727495/1692632

    【讨论】:

    • 达卡,没有。有 2 个答案与您的答案不同,可以解释实际差异。
    • 和这个一样
    • Darka,这是一个基于 SQL 的解决方法,它返回与 Excel 相同的日期,但它没有解决原始问题。
    猜你喜欢
    • 1970-01-01
    • 2017-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-04
    相关资源
    最近更新 更多