具有日期转换的TSQL派生列,用于检查非日期可转换字符串

时间:2012-08-17 16:51:44

标签: sql tsql sql-server-2008-r2 type-conversion

我有一个日期列,日期存储为字符串,例如20120817.不幸的是,填充此列的文本表单字段是自由文本,因此我不能保证偶尔会出现“E”或“what”柱。而且已经有不止一些。

我需要做的是将字符串列转换为日期列。当然转换将拒绝随机字符串字符。有没有办法创建一个派生列,不仅可以转换字符串,还可以排除非日期可转换字符串?

如果表格中没有非日期可兑换字符串,则以下内容可行:

ADD [convertedDate] AS CONVERT(DATE, [stringDate], 102)

它在我创建的测试表中完美运行。但是当我介绍其他不可转换的字符串时,我收到了可怕的“从字符串转换日期和/或时间时转换失败”错误,原因很明显。

是否有一个函数可以捕获我可以添加到此派生列代码的不可转换元素?或者视图或功能是唯一 - 或最好 - 处理此方法?我玩IsDate()时运气不佳。

谢谢!

3 个答案:

答案 0 :(得分:1)

如果您使用的是SQL Server 2012,则可以使用try_convert函数

http://msdn.microsoft.com/en-us/library/hh230993.aspx

如果转换成功,它将正常工作,但如果转换失败则返回null

ADD [convertedDate] AS TRY_CONVERT(DATE,[stringDate],102)

答案 1 :(得分:1)

有一个名为ISDATE(date)的函数,也许你可以在CASE语句或查询的WHERE部分使用它......这取决于你是怎么做的,也许是这样的

ADD [convertedDate] AS CASE WHEN ISDATE([stringDate]) = 1 THEN CONVERT(DATE,[stringDate], 102) ELSE NULL END

答案 2 :(得分:0)

这应该给你一些想法......

DECLARE @date1 varchar(50)
DECLARE @date2 varchar(50)
SET @date1 = '20120101'
SET @date2 = 'e20120101'

SELECT
ISDATE(@date1),
ISDATE(@date2),
CASE WHEN ISDATE(@date1) = 1 THEN CONVERT(SMALLDATETIME,@date1) END,
CASE WHEN ISDATE(@date2) = 1 THEN CONVERT(SMALLDATETIME,@date2) END