在进行结果计数时转换失败并带有日期

时间:2016-09-15 13:09:33

标签: sql sql-server date

我最近在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();

1 个答案:

答案 0 :(得分:1)

答案是无法保证WHERE子句的运行顺序。看起来它可能在过滤userkey或attrName上的行之前应用值字段的转换。计数最有可能导致计划改变,这只是一个不幸的副作用。

您可以使用userkey和attrname检索行,然后转换该值。

好奇,userkey字段上有索引吗?在attrname上?