2012-01-20 32 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