开发者

SELECT CASE CAST Conversion Error

开发者 https://www.devze.com 2023-02-19 13:45 出处:网络
I\'m querying the back-end of an application.For what ever reason the developer decided to use NVARCHAR for all fields.I\'m having a problem with one of the \"date\" fields--somehow it got populated w

I'm querying the back-end of an application. For what ever reason the developer decided to use NVARCHAR for all fields. I'm having a problem with one of the "date" fields--somehow it got populated with "97630886". There's a companion "time" field and for my query I'm trying to concatenate and CAST the results as a DATETIME. I'm trying to use a CASE statement but it's erroring: "The conversion of a char data type to a datetime data type resulte开发者_如何学JAVAd in an out-of-range datetime value.". Apparently all conditions are evaluated? Is there a way I can rewrite my SELECT statement to handle this?

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 ...


You can't mix datatypes in CASE expressions (or at least without taking care that they will implicitly cast OK)

when confronted with a stament like the following SQL Server will use datatype precedence to determine what the overall datatype of the expression should be

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

For the above datetime has higher precedence than char so it implicitly casts the string to a date which fails.

The folowing succeeds however as sql_variant has a higher precedence

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

So you can return multiple mixed datatypes that way (I'm not sure how easy sql_variant is to work with though)

Other than that you could return NULL for invalid datetimes instead of returning the nonsense data or cast everything to a string if you must return it.

0

精彩评论

暂无评论...
验证码 换一张
取 消