我查询应用程序的后端。出于某种原因,开发人员决定将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 ...
答案 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
无效的日期时间,而不是返回无意义的数据,或者如果必须将其返回,则将所有内容强制转换为字符串。