2015-09-01 41 views
1

我的同事們將excel工作表中的日期,貨幣和百分比格式化爲「常規」,然後將表導出爲標籤分隔文本文件。這樣做是爲了捕獲所有原始數據並消除格式化和舍入。例如30%返回到原始值0.29854。導出文件被導入到SQL Server中。Excel文本或通用格式化日期SQL Server中的導入和轉換

我的問題是日期得到設置爲一個exell數字,我很難將其轉換爲日期,一旦它被導入到SQL Server中。例子如下:

Date Fmt General Fmt 
9/3/2008 39694 
7/1/2010 40360 
5/4/2011 40667 

有誰知道我可以導入通用格式值到SQL Server爲VARCHAR,然後將其轉換回一個日期嗎?

顯而易見的答案是不將日期格式設置爲常規,但我無法控制此過程並且無法更改它。

我試圖使用DATEADD()來重新轉換日期從1/1/1900。就excel而言,這是日期1。有關詳情,請參閱以下內容:http://www.exceltactics.com/definitive-guide-using-dates-times-excel/#How-Excel-Stores-Dates

我發現使用此解決方案的問題是其兩天休息。

select dateadd(d,39694,'1/1/1900') = 9/5/2008 { should be 9/3/2008 } 
select dateadd(dd,40360,'1/1/1900') = 7/3/2010 { should be 7/1/2010 } 
select dateadd(dd,40677,'1/1/1900') = 5/6/2011 { should be 5/4/2011 } 

我承認這很可能是一個舍入誤差,但有沒有更好的方式來將它轉換爲捕獲在SQL Server中正確的日期?

如果我簡單地調整到DateAdd(d,#####,'12/30/1899'),我確實得到了正確的答案,但在未來的某個地方,這也將是一個休息日。我不夠聰明,想知道這可能發生什麼時候...

感謝您的任何幫助。

回答

1

Excel日期序列值有點搞砸了。毫無疑問,微軟會責怪Lotus 1-2-3。

給定一個表示19000301以後日期的Excel序列值,可以減去2得到一個整數,SQL Server將在同一日期將其轉換爲datetime。

給定一個表示19000101到19000228之間日期的Excel序列值,可以減1以得到SQL Server將在相同日期轉換爲datetime的整數。

鑑於60的Excel的序列值,你應該恐慌,因爲這代表的虛擬日期19000229.

來源:http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=27101 (複製從用戶X002548「在該論壇)

+0

這麼看這個評論,並假設你在01/03/1900之前沒有任何日期,在你的代碼中硬編碼'-2'似乎是安全的。 –