将序列号转换为日期

时间:2010-09-09 08:10:54

标签: sql sql-server excel formatting

在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计数错误,或者我使用的程序错误来提供这样的值,请你帮助我。

6 个答案:

答案 0 :(得分:4)

前一段时间我问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 :(得分:1)

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

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

答案 2 :(得分:1)

您需要从“excel日期编号”中减去两天,将其转换为“MS SQL日期”。

select dateadd(day,-2, 36526)

<强>解释

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

 select dateadd(day,-1, 36526)

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

因此,我们将excel日期编号转换为SQL Server的最终查询将是

select dateadd(day,-2, 36526)

答案 3 :(得分:0)

Excel提供了将日期转换为字符串的功能(尝试功能列表或Google)。这应该可以解决这个问题。

答案 4 :(得分:0)

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

答案 5 :(得分:0)

日期时间示例:

select cast(44391.7468126852 as datetime) - 2