从字符串转换日期时出现SQL Server错误

ldioqlga  于 2022-10-03  发布在  SQL Server
关注(0)|答案(2)|浏览(332)

NPD.CreatedOn定义为datetime数据类型列(在SQL Server中)。

SELECT * 
FROM NPDMaster NPD 
WHERE DATEDIFF(MONTH, CONVERT(VARCHAR(7), NPD.CreatedOn, 126), CONVERT(VARCHAR(30), GETDATE(), 126)) <= 6

我得到了这个错误:

从字符串转换日期和/或时间时转换失败。

我可以试着解决这个问题吗?

xytpbqjk

xytpbqjk1#

不要在列的WHERE中使用DATEDIFF之类的内容,这样的查询不是可SARGable的,因此性能可能(将)很差。如果您想要日期在6个月前的月初或之后的行,则在GETDATE()/SYSDATETIME()/等上执行日期逻辑:

SQL Server没有“月份开始”功能,但您可以使用EOMONTH,然后添加一天:

SELECT * 
FROM dbo.NPDMaster NPD
WHERE NPD.CreatedOn >= DATEADD(DAY, 1, EOMONTH(GETDATE(),-7));
6psbrbz9

6psbrbz92#

您不需要将datetime值转换为文本。DATEDIFF()预期datetime值作为第二个和第三个参数:

SELECT * 
FROM NPDMaster NPD    
WHERE DATEDIFF(month, NPD.CreatedOn, GETDATE()) <= 6

错误的实际原因(如文档中所述)是*...DATEDIFF隐式地将字符串文字转换为DateTime2类型*。

相关问题