SQL Server日期字符串转换失败报错,求可行解决方法
SQL Server日期计算报错的解决方法
错误根源是DATEDIFF函数要求两个参数均为日期/时间类型,但你将NPD.CreatedOn转换为yyyy-mm格式的字符串,却把GETDATE()转换为完整的日期字符串(如2024-05-20T12:34:56),SQL Server尝试隐式转换这两个不同格式的字符串为日期类型时失败。
以下是可行的解决方法:
方法一:直接基于日期类型计算(最优方案)
无需转换字符串,直接对原始日期类型计算月份差,还能利用CreatedOn字段的索引提升性能:SELECT * FROM NPDMaster NPD WHERE DATEDIFF(MONTH, NPD.CreatedOn, GETDATE()) <= 6方法二:转换为当月第一天的日期再计算
如果需要忽略日时分秒,仅基于“年月”维度统计,可将两个日期都转换为当月第一天,再计算月份差:SELECT * FROM NPDMaster NPD WHERE DATEDIFF(MONTH, DATEFROMPARTS(YEAR(NPD.CreatedOn), MONTH(NPD.CreatedOn), 1), DATEFROMPARTS(YEAR(GETDATE()), MONTH(GETDATE()), 1)) <= 6方法三:统一字符串格式后显式转日期(兼容思路)
若必须使用字符串转换,需保证两个字符串格式一致,再显式转换为日期类型:SELECT * FROM NPDMaster NPD WHERE DATEDIFF(MONTH, CONVERT(DATE, CONVERT(VARCHAR(7), NPD.CreatedOn, 126) + '-01'), CONVERT(DATE, CONVERT(VARCHAR(7), GETDATE(), 126) + '-01')) <= 6
注意:方法三会导致
CreatedOn字段的索引失效,大数据量场景下不推荐使用,优先选择方法一或方法二。
内容的提问来源于stack exchange,提问作者Baba Ranjith
相关产品推荐
相关产品推荐

