2012-01-20 33 views
1

我有一個字符串字段dob具有各種格式的birthdates,例如在SQL中標準化日期。算術溢出

DOB

1945年7月1日
1967年1月7日
13 1956年5月

8 1947年5月
1953年9月27日
1952年3月25日

我有試圖使用MS SQL 2005創建標準化日期字段

select convert(datetime,dob,103) 
from myTable 

我得到算術溢出似乎與最後一個值相關聯,大概是因爲它試圖將25轉換爲一個月,當它是一天 我試過 設置語言英國和其他各種風格沒有成功

有什麼建議嗎?

回答

1

你爲什麼要嘗試以給定的格式存儲它?你不能把它作爲日期時間類型存儲嗎?將它存儲在獨立語言環境中的最大優點是可以將表示邏輯卸載到它所屬的UI。此外,您可以避免凌亂的情況,其中3-4-5(2003年4月5日,2005年3月4日,2005年4月3日)。

轉換爲日期時間對我來說工作得很好(美國語言環境)。

; with myTable (dob)as 
(
    select 'July 1, 1945' 
    UNION ALL SELECT '1967-1-7' 
    UNION ALL SELECT '13 May 1956' 
    UNION ALL SELECT '8 may 1947' 
    UNION ALL SELECT '27 september 1953' 
    UNION ALL SELECT '1952-3-25' 
) 
SELECT 
    cast(T.dob AS datetime) AS real_datetime 
, T.dob 
FROM 
    myTable T 

結果

real_datetime dob 
1945-07-01 00:00:00.000 July 1, 1945 
1967-01-07 00:00:00.000 1967-1-7 
1956-05-13 00:00:00.000 13 May 1956 
1947-05-08 00:00:00.000 8 may 1947 
1953-09-27 00:00:00.000 27 september 1953 
1952-03-25 00:00:00.000 1952-3-25 
+0

感謝。我認爲問題在於103風格。但是,當我將它應用到整個表格時,我仍然遇到同樣的錯誤。只有單一年,空值和空白似乎不會造成問題。無論如何,SQL可以識別導致錯誤的行,以便我可以修復/排除它們 – pssguy

+0

容易但不保證工作的解決方案是添加一個where子句,如WHERE ISDATE( T.dob)> 0' Aaron Bertrand對我的類似[問題]有一個很好的解釋+方法(http://dba.stackexchange.com/questions/5312/conversion-of-varchar-data-to-datetime-failing) – billinkc

+0

謝謝我剛到達相同的解決方案! – pssguy