2010-09-09 149 views
2

在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

我認爲Excel正在做的是將日期轉換爲int表示。你有沒有試圖直接施放它? – 2010-09-09 08:15:54

+0

謝謝你的回覆。我也嘗試過CAST。這也是返回originaldate + 2天。例如: - 對於這個40319,它應該返回21.05.2010。但是回報23.05.10 – satya 2010-09-09 08:54:31

回答

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

+0

+1非常感謝。這幫助我理解爲什麼有兩天不同。 – satya 2010-09-09 08:44:59

0

Excel提供將日期轉換爲字符串的函數(嘗試函數列表或Google)。這應該可以避免這個問題。

1

正如有人所說,將其轉換爲一個更好的格式首先是Excel。

最有可能的Excel和SQL Server有不同的需要從1900-01-01有多少天。我認爲Excel有一些古怪的問題,1900年是閏年或者沒有(爲了1-2-3的兼容性?),所以還有一個額外的日子。另一個我不知道,也許它開始依靠1900-01-02或Excel實際上開始於1900-01-00或什麼? ^^

1

您需要從「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) 
+0

在SQL 2012上,我打賭2014這顯示1天休息,我使用select dateadd(day,-2,40317)來獲得正確的日期。這可能與閏年有關。不確定,我需要繼續研究。 – 2014-10-16 15:39:06

+0

嗨@穆罕默德烏斯曼,我試過你的解決方案,它工作正常,但如果我嘗試使用列名稱代替這個數字的同一行它是失敗,並給我一個錯誤,像'Msg 241,級別16,狀態1,行1 轉換日期和/或時間從字符串轉換失敗。' 例如:'select dateadd(day,-2,IssueDate)FROM myTable' – 2017-08-04 09:50:26

0

不僅Excel中0日期是1/0/1900,但是看起來,微軟認爲1900是一個飛躍芽兒這爲什麼我們可以在Excel中找到一個值爲60的02/29/1900。但1900年像每個世紀一樣(除了400的倍數)不是閏年,這就是爲什麼你必須減少2天。