2009-09-02 38 views
0

我有一个500万条日志记录存储为char(10)格式为yyyy/mm/dd的表。我需要把这些转化为datetime,所以我用:SQL更新varchar到日期错误

UPDATE [Database].[dbo].[Table] 
    SET [DoB]=convert(datetime,[DoBText],103) 
GO 

但我得到的错误:

“varchar数据类型为datetime数据类型的转换导致的超出范围值。”

现在,我已经尝试修复数据,所以这不会发生 - 即不低于1900或2000以上的“yyyy”,没有“dd”高于30(2月28日),没有“mm”高于12或低于0.没有NULL。

转换仍然失败。

有没有什么办法可以让SQL跳过对错误的转换,然后继续?

E.g.是这样的:

SET [DoB]= try to do [DoB]=convert(datetime,[DoBText],103) if fails SET [DoB] = NULL 

感谢 卡尔

+0

有些月份有31天 - 我希望你没有破坏你的数据:S – 2009-09-02 08:24:30

+0

此外,没有月份零 - 月份应该是1-12包括在内。 – 2009-09-02 08:25:02

回答

1

尝试以下操作:

SET DATEFORMAT YMD; 

UPDATE [Database].[dbo].[Table] 
SET [DoB]=[DoBText] 
WHERE ISDATE([DoBText]) = 1 

这将转换那些被确认为有效的日期/时间值,其余将保持原样。

0

插入YYYYMMDD格式或参数,使用日期,你会不会有这个问题。 或执行以下操作

SET DATEFORMAT DMY 
SET DATEFORMAT MDY 
SET DATEFORMAT YMD 
SET DATEFORMAT YDM 
1

转换风格103的一个处理格式为dd /月/年的日期。使用转换样式111来处理格式为yyyy/mm/dd。

+0

感谢您指出了这一点! – Karl 2009-09-02 10:54:20