我最近在SQL Server上遇到了一个奇怪的问题。
我正在使用的应用程序是在包含用户/属性/值记录的表中保存用户的属性。我需要查找用户是否仍然有效使用他的有效期结束日期。我一直在使用的查询如下:
SELECT COUNT(*) FROM value_all
WHERE AttrName = 'VALIDTO' AND
userkey=574924 AND
CONVERT (DATE,Value, 120) < GETDATE();
转换是必要的,因为所有值都存储为VARCHAR。
查询工作正常但最近我遇到了以下错误:
SQL Error [241] [S0001]: Conversion failed when converting date and/or time from character string.
我认为存储的有效日期是错误的。但是,该值与正确的格式匹配:
SELECT * FROM value_all
WHERE AttrName = 'VALIDTO' AND
userkey=574924 AND
|userkey |AttrName |Value |
|--------|-----------|--------------------|
|574924 |VALIDTO |2016-07-31T23:59:59 |
我甚至可以进行转换并正确显示结果:
SELECT CONVERT (DATE,Value, 120) AS Date FROM value_all
WHERE AttrName = 'VALIDTO' AND
userkey=574924 AND
CONVERT (DATE,Value, 120) < GETDATE();
|Date |
|-----------|
|2016-07-31 |
但是,只要我添加COUNT
,就会出现错误。
在这种情况下,是否有人知道发生了什么?它是否以某种方式与所使用的价值相关联?
感谢&#34; Conversion to datetime fails only on WHERE clause?&#34;的问题,我能够按照以下方式重新处理我的查询,从而纠正了我遇到的问题:
SELECT COUNT(*) FROM value_all
WHERE AttrName = 'VALIDTO' AND
userkey=574924 AND
CONVERT (DATE, CASE WHEN ISDATE(Value) THEN Value END, 120) < GETDATE();
答案 0 :(得分:1)
答案是无法保证WHERE子句的运行顺序。看起来它可能在过滤userkey或attrName上的行之前应用值字段的转换。计数最有可能导致计划改变,这只是一个不幸的副作用。
您可以使用userkey和attrname检索行,然后转换该值。
好奇,userkey字段上有索引吗?在attrname上?