2014-03-19 65 views
9

我從CSV導入數據的表如下:轉換VARCHAR列於日期時間格式 - SQL服務器

FirstTimeTaken  LatestTimeTaken  Market     Outcome   Odds NumberOfBets VolumeMatched InPlay 
03/08/2013 15:30:14 03/08/2013 15:32:28 Over/Under 3.5 Goals Over 3.5 Goals 5  10    118    1 
03/08/2013 14:26:40 03/08/2013 14:29:43 Correct Score   0 - 0   7  12    279    1 
03/08/2013 15:15:34 03/08/2013 15:27:39 Match Odds    Barnsley  110  7    9    1 
28/07/2013 16:57:26 29/07/2013 21:35:55 Match Odds    Barnsley  3  9    35    0 

我不得不進口第2列VARCHAR格式,因爲我得到的錯誤嘗試導入作爲日期時間。現在我有一個表中的數據,我需要將列格式從Varchar轉換爲日期時間。我想:

ALTER TABLE #CSVTest_Data 
ALTER COLUMN FirstTimeTaken DATETIME 
ALTER TABLE #CSVTest_Data 
ALTER COLUMN LatestTimeTaken DATETIME 

這導致錯誤:「varchar數據類型爲datetime數據類型的轉換導致外的範圍內的值」。 我知道刪除最後一行數據擺脫了這個問題,所以我懷疑係統認爲日期格式是MM/DD/YYYY,而實際上它是DD/MM/YYYY。 以下查詢工作正常:

SELECT convert(VARCHAR(50),FirstTimeTaken,105) from #CSVTest_Data 
SELECT convert(VARCHAR(50),LatestTimeTaken,105) from #CSVTest_Data 

但是,這不會將列格式轉換爲日期時間。我將不勝感激一些關於如何做到這一點的幫助。謝謝。

+0

你用什麼方法導入這些? – Zane

+1

如果所有字段的格式都與我們看到的格式一樣,那麼一個簡單的'Cast(FirstTimeTaken as datetime)'應該能夠做到這一點。 –

+0

@DaveJohnson:我認爲這不起作用:'選擇CAST('28/07/2013 16:57:26'AS DATETIME)'。至少不在OP的環境中。 – DMason

回答

4

嘗試使用SET DATEFORMAT

SET DATEFORMAT dmy 
+0

我在ALTER COLUMN命令之前添加了您的代碼行,並且它完美地工作。我甚至在第一次運行後將你的代碼行註釋掉了,並且所有代碼仍然正常工作。該代碼是否永久修改了我的設置? –

+0

是的,您可能想在完成重置後運行'SET DATEFORMAT mdy'。 –

+0

我在英國,所以我希望它應該永久設置爲DMY。謝謝 –

2

如下您可以選擇從#TEMP表中的數據:

SELECT 
    CONVERT(DATETIME, FirstTimeTaken, 103), 
    CONVERT(DATETIME, LatestTimeTaken, 103) 
FROM #CSVTest_Data 

這將返回領域DATETIME數據類型。從那裏,做任何你需要的。

相關問題