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