2010-11-03 32 views
0

在當前表中,我有一列以ddmmyyyy格式保存日期字段,它的類型爲varchar(8)。該列也有一些字符串值。如果源列中的值是有效的日期時間,我想創建一個計算列,該列將保留DateTime格式的值。計算列

+0

友情提示:以下所有答案均無法解決DateFormat問題 – smirkingman 2010-11-03 16:22:50

回答

0

假設你的VARCHAR(8)列dateString

Cast([dateString] as datetime) 
+0

將varchar數據類型轉換爲日期時間數據類型導致超出範圍的值。嘗試 選擇Cast('01011900'作爲日期時間)作爲myDate。 以下將起作用 選擇Cast('19000101'作爲日期時間)作爲myDate。 – Nabin 2010-11-03 14:41:15

+0

我不認爲有一種方法可以在計算列表達式中執行TRY CATCH。你將不得不做一些數據清理。 – dotariel 2010-11-03 14:42:52

0

嘗試解析您的VARCHAR到DD/MM/YYYY嘗試投前:

cast(substring([datestring],1,2) + '/' + 
substring([datestring],3,2) + '/' + 
substring([datestring],5,4) as datetime) 
+0

此問題有一個SQL2005標記。 DATE數據類型是在SQL2008中添加的。 – 2010-11-03 15:48:17

+0

謝謝,@G馬斯特羅斯,我編輯了我的回覆 – Beth 2010-11-03 15:54:25

0

的SQL Server喜歡的格式日期的yyyymmdd,所以會有一些字符串操作涉及到格式化你的數據。我們還應該使用IsDate函數來確保我們有一個有效的日期。

所以:

Cast(Case When IsDate(Right(@Data, 4) 
    + SubString(@Data, 3, 2) 
    + Left(@Data, 2)) = 1 
     Then Right(@Data, 4) 
      + SubString(@Data, 3, 2) 
      + Left(@Data, 2) End As DateTime) 

注意,此代碼應正確處理包含您的VARCHAR列中的無效日期。如果日期無效,此代碼將返回NULL。