将序列号转换为date

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

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

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

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

假设Excel计算从01-01-1900的日子。 所以我添加数字--[Due Date]这应该给我适当的格式化date..

但是这给我一个值2010-05-21 00:00:00.000

能不能由于从01-01-1900计算的Excel是错误的,或者我用过的程序错误地给出了这样的价值,请帮助我。

前一段时间我问了一个类似的问题 – 这不是说Excel而是VB6,因此我并不是说这个问题是重复的。 但是,我认为的答案是一样的。

SQL中的date0是01/01/1900。
VB6中的date0是2天前的30/12/1899 – 这就解释了差异。
所以我相信Excel是一样的。

在Excel中,我在一个单元格中input0,并将单元格格式化为一个date – 显示(奇怪地是IMO)0/1/1900。 我有一个快速查找另一个参考,这个答案明确,但没有设法find一个。

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

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

最有可能的Excel和SQL Server有不同的需要从1900-01-01有多less天。 我认为Excel有一些1900年闰年的老怪病(为了1-2-3的兼容性?),所以有一个额外的日子。 另一个我不知道,也许它开始依靠1900-01-02或Excel实际上开始1900-01-00或什么? ^^

您需要从“exceldate编号”中减去两天,将其转换为“MS SQLdate”。

 select dateadd(day,-2, 36526) 

说明:

Excel使用0-jan-1900作为其开始date,而SQL服务器使用1-jan-1900,因此要将exceldate转换为MS SQLdate,则可以这样做

  select dateadd(day,-1, 36526) 

但是,等一下,早期版本的Excel有错误,计算1900年是一个闰年,但事实上这不是一个闰年。 当前版本仍然计算相同(我假设由于向后兼容性, 或者使用1904date系统而不是1900date系统 )。 所以我们需要再减去1天来解决这个问题。

所以我们最后的查询将Exceldate编号转换为SQL Server将是

 select dateadd(day,-2, 36526) 

Excel提供将date转换为string的函数(尝试函数列表或Google)。 这应该可以避免这个问题。

不仅Excel 0date是1/0/1900,而且微软似乎认为1900年是一个飞跃,所以我们可以find一个值为60的Excel的02/29/1900。但1900年像每个世纪一样除了400的倍数)不是一个闰年,这就是为什么你必须减less2天。