【问题标题】:Conversion failure with date when doing a count of result [duplicate]计算结果时日期转换失败[重复]
【发布时间】:2016-09-15 13:09:33
【问题描述】:

我最近在 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,错误又回来了。

有没有人知道在这种情况下发生了什么?它是否以某种方式与使用的价值相关联?

编辑

感谢“Conversion to datetime fails only on WHERE clause?”提出的问题,我能够按如下方式修改我的查询,从而纠正了我遇到的问题:

SELECT COUNT(*) FROM value_all
WHERE AttrName = 'VALIDTO' AND
    userkey=574924 AND
    CONVERT (DATE, CASE WHEN ISDATE(Value) THEN Value END, 120) <  GETDATE();

【问题讨论】:

  • 而不是使用COUNT(*) 使用COUNT(CONVERT (DATE,Value, 120))
  • 你试过用 select count(1) 代替 select count(*) 吗?它可能不会有所作为,但只是为了确定
  • 我想向您指出这个答案,尤其是底部的链接:stackoverflow.com/a/39504506/5089204
  • @artm,它不会改变结果,我在 COUNT 中使用转换时仍然出现错误
  • @Shnugo,感谢您的链接,我会尝试查看它。但是,在错误消息旁边,我没有看到与建议的重复项的相似之处。您能否指出这个问题的更准确的部分?

标签: sql sql-server date


【解决方案1】:

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

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

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

【讨论】:

  • 也很想知道计划是否显示谓词的顺序(我不知道计划中是否说明了谓词的顺序,但我想知道。你可以在@发布987654321@
  • 嗨。您查看索引是正确的,UserKey、AttrName 和 Value 都已编入索引,但是对非索引列进行计数不会导致问题。我想这也是一个不同的计划,我会尝试发布它们。
  • 另外,答案最好在这里stackoverflow.com/questions/7263501/…
  • 是的,这似乎是真正的问题。我将不得不使用那里提出的“ISDATE”解决方案,因为我无法更改数据库的架构
猜你喜欢
  • 2016-12-26
  • 1970-01-01
  • 2018-10-07
  • 1970-01-01
  • 2013-07-31
  • 2010-11-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多