【问题标题】:conversion failed when converting date and/or time from character to string in where clause在 where 子句中将日期和/或时间从字符转换为字符串时转换失败
【发布时间】:2020-10-09 16:51:15
【问题描述】:

我有一个表,其中 service_date 是 char(8),例如 20191007。我将convert(date,service_date) 设置为 new_date,它似乎将其转换为日期数据类型。当我尝试使用convert(date,service_date) >= '2019-10-07' 时,出现“将日期和/或时间从字符转换为字符串时转换失败”错误。我需要进行哪些更改才能使其正常工作?

谢谢。

【问题讨论】:

  • 请显示表架构和完整的命令运行。
  • 使用 try_convert(date,service_date) 。我怀疑你有一些虚假数据。 try_convert 将返回 NULL 而不是抛出错误。识别问题记录... SELECT * FROM YOURTABLE where try_convert(date,service_date) is NULL
  • 不使用日期和时间数据类型来存储日期和/或时间值的危险;人们存储的值不是有效的日期和时间值。我强烈建议修复您的数据模型。
  • 修复您的模型 +1。将日期存储在日期字段中。 不要试图解决根本不应该存在的问题。 您还应该获得更好的性能(在大数据集上很明显)和更好地利用索引(如果存在)。如果您想以不同格式显示日期,则更灵活。
  • 不幸的是,这些数据来自我所在的州人类服务部,所以我对它的存储方式没有发言权。

标签: sql sql-server date select where-clause


【解决方案1】:

您存储日期的字符串格式使得过滤字符串文字成为可能,所以我会使用:

service_date >= '20191007'

这比使用转换函数更有效,因为它可以利用列上的索引(如果有的话)。

但是,正如 John Cappelletti 所说,如果您的数据格式不正确,这可能会产生无法执行的结果。在这种情况下,请使用try_cast()

try_cast(service_date as date) >= '20191007'

try_cast() 尝试将字符串转换为目标数据类型,如果转换失败则返回 null

【讨论】:

  • 这也会获取 alpha 字符串和虚假日期。 OP 犯了将日期存储为字符串的悲惨错误。 service_date 可以包含任何内容...甚至是 Jan 12 1970,即 >= '20191007'
  • @JohnCappelletti:是的,阅读 cmets 是一个好点。我更新了我的答案以建议try_cast()
  • 再想一想,你可以使用 BETWEEN '20191007' 和 '20201231'
猜你喜欢
  • 1970-01-01
  • 2012-04-17
  • 2017-12-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多