SELECT CASE CAST转换错误

时间:2011-03-25 14:29:28

标签: sql sql-server-2005 tsql

我查询应用程序的后端。出于某种原因,开发人员决定将NVARCHAR用于所有领域。我对其中一个" date"有问题?字段 - 不知何故,它填充了" 97630886"。有一个伴侣"时间"字段和我的查询我试图连接和CAST结果作为DATETIME。我试图使用CASE语句,但它出现错误:"将char数据类型转换为日期时间数据类型会导致超出范围的日期时间值。" 。显然所有条件都经过评估?有没有办法可以重写我的SELECT语句来处理这个问题?

SELECT CASE 
WHEN LOG_DATE IS NULL AND LOG_TIME IS NULL THEN NULL 
WHEN LOG_DATE IS NULL THEN LOG_TIME 
WHEN LOG_TIME IS NULL THEN LOG_DATE 
WHEN ISDATE(LOG_DATE) = 0 OR ISDATE(LOG_TIME) = 0 THEN LOG_DATE + ' ' + LOG_TIME 
ELSE CAST(LOG_DATE + ' ' + LOG_TIME AS DATETIME)
END AS [LogDateTime] 
FROM ...

1 个答案:

答案 0 :(得分:3)

你不能在CASE表达式中混合数据类型(或者至少不要小心它们会隐式地转换为OK)

当遇到类似以下SQL Server的内容时,将使用数据类型优先级来确定表达式的整体数据类型应该是什么

SELECT CASE WHEN 1=1 THEN 'not-a-date' ELSE getdate() END

因为上面的datetime优先级高于char所以它会隐式地将字符串强制转换为失败的日期。

然而,以sql_variant has a higher precedence

成功了
SELECT CASE WHEN 1=1 THEN cast('not-a-date' as sql_variant) ELSE getdate() END

所以你可以通过这种方式返回多个混合数据类型(我不确定sql_variant是多么容易使用)

除此之外,您可以返回NULL无效的日期时间,而不是返回无意义的数据,或者如果必须将其返回,则将所有内容强制转换为字符串。