【问题标题】:Converting a serial number into date将序列号转换为日期
【发布时间】:2010-09-09 08:10:53
【问题描述】:

我将在 Excel 工作表中接收数据,然后我需要将其上传到 SQL 服务器,然后实现逻辑。

我收到了一个日期字段--[Due Date],例如:-.40317。在 Excel 中,如果您右键单击它,然后将其格式化为日期。它将显示正确的日期为19.05.2010

所以在按原样上传文件后。我用过,

SELECT (dateAdd(day,[Due Date],'1900-01-01')) FROM table1.

假设 Excel 从 01-01-1900 开始计算天数。所以我添加了数字--[Due Date] 这应该给我正确的格式化日期..

但这会返回2010-05-21 00:00:00.000 的值。

您能否帮助我是否假设 Excel 从01-01-1900 计数是错误的,或者我使用的程序给出这样的值是错误的。

【问题讨论】:

  • 我认为 Excel 正在做的是将 Date 转换为 int 表示形式。你试过直接投射吗?
  • 感谢您的回复。我也尝试过 CAST。这也是返回 originaldate+2 天。例如:- 对于这个 40319,它应该返回 21.05.2010。但返回 23.05.10

标签: sql sql-server excel formatting


【解决方案1】:

我不久前问过similar question - 它不是在谈论 Excel,而是在谈论 VB6,因此我并不是说这个问题是重复的。但是,我认为答案是一样的。

SQL 中的日期 0 是 01/01/1900。
VB6 中的日期 0 是 30/12/1899,提前 2 天 - 这解释了差异。
所以我相信 Excel 也是一样的。

在 Excel 中,我在一个单元格中输入 0 并将该单元格格式化为日期 - 显示(奇怪的是 IMO)0/1/1900。我快速浏览了一下,找到了另一个可以明确回答这个问题的参考资料,但还没有找到。

编辑:
提取在我的问题中提供给我的链接(与 Excel 相关):
http://www.ozgrid.com/forum/showthread.php?t=46561
http://www.joelonsoftware.com/items/2006/06/16.html

【讨论】:

  • +1 非常感谢。这有助于我理解为什么会有 2 天的差异。
【解决方案2】:

正如有人所说,先在Excel中将其转换为更好的格式。

很可能 Excel 和 SQL Server 对从 1900 年 1 月 1 日起的天数有不同的看法。我认为 Excel 有一些旧的怪癖,1900 年是否是闰年(为了 1-2-3 兼容性?)所以有一个额外的日子。另一个我不知道,也许它从 1900-01-02 开始计数,或者 Excel 实际上从 1900-01-00 开始或其他什么? ^^

【讨论】:

    【解决方案3】:

    您需要从“excel 日期数”中减去两天才能将其转换为“MS SQL 日期”。

    select dateadd(day,-2, 36526)
    

    说明:

    Excel 使用 0-jan-1900 作为开始日期,而 SQL Server 使用 1-jan-1900,因此要将 excel 日期转换为 MS SQL 日期,您可以执行以下操作

     select dateadd(day,-1, 36526)
    

    但是等一下,早期版本的 excel 有错误,将 1900 年计算为闰年,但实际上它不是闰年。当前版本仍然计算相同(我假设由于向后兼容性。Or use the 1904 Date System rather than 1900 date system)。所以我们需要再减去 1 天来解决这个问题。

    所以我们将 excel 日期数字转换为 SQL Server 的最终查询将是

    select dateadd(day,-2, 36526)
    

    【讨论】:

    • 在 SQL 2012 上,我打赌 2014 年显示 1 天休息,我使用 select dateadd(day, -2, 40317) 来获取正确的日期。这可能与闰年有关。不确定,我需要继续研究。
    • 嗨@Muhammad Usman,我尝试了您的解决方案,它工作正常,但如果我尝试使用列名的同一行代替该数字,它会失败并给我一个类似Msg 241, Level 16, State 1, Line 1 Conversion failed when converting date and/or time from character string. 示例的错误:select dateadd(day,-2,IssueDate) FROM myTable
    【解决方案4】:

    Excel 提供了将日期转换为字符串的函数(试试函数列表或谷歌)。这应该可以避免问题。

    【讨论】:

      【解决方案5】:

      不仅 Excel 0 日期是 1/0/1900,而且微软似乎认为 1900 年是一个闰年,这就是为什么我们可以在 Excel 中找到 02/29/1900 的值为 60。但是 1900 年就像每个世纪年(400 的倍数除外)不是闰年,这就是为什么你必须减去 2 天。

      【讨论】:

        【解决方案6】:

        日期时间示例:

        select cast(44391.7468126852 as datetime) - 2
        

        【讨论】:

          猜你喜欢
          • 2012-11-30
          • 1970-01-01
          • 2013-04-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-10-05
          相关资源
          最近更新 更多