2

我有一个日期列,其中日期存储为字符串,例如 20120817。不幸的是,填充此列的文本表单字段是自由文本,因此我不能保证偶尔会在此列中显示“E”或“whatever”。而且已经有不少了。

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

如果表中没有非日期可转换字符串,则以下内容将起作用:

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

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

是否有一个函数可以捕获我可以添加到这个派生列代码中的不可转换元素?还是视图或函数是处理此问题的唯一或最佳方法?我很幸运地玩了 IsDate() 。

谢谢!

4

3 回答 3

1

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

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

转换成功则正常工作,转换失败则返回null

添加 [convertedDate] AS TRY_CONVERT(DATE, [stringDate], 102)

于 2012-08-17T17:00:13.763 回答
1

有一个函数ISDATE(date)叫做

ADD [convertedDate] AS CASE WHEN ISDATE([stringDate]) = 1 THEN CONVERT(DATE,[stringDate], 102) ELSE NULL END
于 2012-08-17T17:00:50.403 回答
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
于 2012-08-17T17:15:06.250 回答