2010-11-03 74 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。