【发布时间】: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