Sql 在where子句中将日期和/或时间从字符转换为字符串时,转换失败
我有一张桌子,上面的服务日期是char(8),比如20191007。我做了一个Sql 在where子句中将日期和/或时间从字符转换为字符串时,转换失败,sql,sql-server,date,select,where-clause,Sql,Sql Server,Date,Select,Where Clause,我有一张桌子,上面的服务日期是char(8),比如20191007。我做了一个转换(日期,服务日期)为新日期,它似乎将其转换为日期数据类型。当我尝试使用convert(date,service_date)>=“2019-10-07”时,我得到了“将日期和/或时间从字符转换为字符串时转换失败”错误。我需要改变什么才能让它工作 谢谢。存储日期的字符串格式可以根据sring文本进行过滤,因此我只使用: service_date >= '20191007' 这比使用转换函数更有效,因为它可以利用
转换(日期,服务日期)
为新日期,它似乎将其转换为日期数据类型。当我尝试使用convert(date,service_date)>=“2019-10-07”
时,我得到了“将日期和/或时间从字符转换为字符串时转换失败”错误。我需要改变什么才能让它工作
谢谢。存储日期的字符串格式可以根据sring文本进行过滤,因此我只使用:
service_date >= '20191007'
这比使用转换函数更有效,因为它可以利用列上的索引(如果有)
但是,正如John Cappelletti所评论的,如果您的数据格式不正确,这可能会产生意外的结果。在这种情况下,请使用try\u cast()
:
try\u cast()
尝试将字符串转换为目标数据类型,如果转换失败,将生成null
。存储日期的字符串格式可以根据sring文本进行过滤,因此我只使用:
service_date >= '20191007'
这比使用转换函数更有效,因为它可以利用列上的索引(如果有)
但是,正如John Cappelletti所评论的,如果您的数据格式不正确,这可能会产生意外的结果。在这种情况下,请使用try\u cast()
:
try\u cast()
尝试将字符串转换为目标数据类型,如果转换失败,则生成null
。请显示表架构和完整的命令运行。使用try\u convert(日期、服务日期)。我怀疑你有一些伪造的数据。try\u convert将返回NULL而不是抛出错误。要识别问题记录。。。从try_convert(date,service_date)为空的表中选择*不使用日期和时间数据类型存储日期和/或时间值的风险;人们存储的值不是有效的日期和时间值。我强烈建议修复数据模型。修复模型+1。将日期存储在日期字段中。不要试图解决一个根本不应该存在的问题。您也应该获得更好的性能(在大数据集上很明显),如果存在索引,还应该获得更好的利用率。如果您想以不同的格式显示日期,则更具灵活性。不幸的是,数据来自我所在的美国公共服务部,因此我无法确定数据的存储方式。请显示表架构并运行完整的命令。请使用try\u convert(日期、服务日期)。我怀疑你有一些伪造的数据。try\u convert将返回NULL而不是抛出错误。要识别问题记录。。。从try_convert(date,service_date)为空的表中选择*不使用日期和时间数据类型存储日期和/或时间值的风险;人们存储的值不是有效的日期和时间值。我强烈建议修复数据模型。修复模型+1。将日期存储在日期字段中。不要试图解决一个根本不应该存在的问题。您也应该获得更好的性能(在大数据集上很明显),如果存在索引,还应该获得更好的利用率。如果你想以不同的格式显示日期,则需要更大的灵活性。不幸的是,这些数据来自我所在的美国公共服务部,因此我无法决定如何存储这些数据。这也会拾取alpha字符串和假日期。OP犯了一个悲惨的错误,将日期存储为字符串。服务\u日期可以包含任何内容。。。即使是1970年1月12日,也>='20191007'@johncapelletti:是的,通读这些评论是一个很好的观点。我更新了我的答案,建议试试cast()。OP犯了一个悲惨的错误,将日期存储为字符串。服务\u日期可以包含任何内容。。。即使是1970年1月12日,也>='20191007'@johncapelletti:是的,通读这些评论是一个很好的观点。我更新了我的答案,建议try_cast()
。另一个想法是,您可以在'20191007'和'20201231'之间使用