我正在尝试查看过去 30 天内安装的软件。我的日期格式是20150327
。当我尝试在 where
子句中执行以下条件
and DateDiff(day,arp.InstallDate0,GetDate()) < 30
我收到以下错误消息:
Conversion failed when converting date and/or time from character string.
我也尝试过以下方法,但没有成功:
CONVERT(varchar(8),arp.InstallDate0,112)
以及:
ISDATE(CONVERT(datetime,arp.InstallDate0,112))
当我添加 ISDATE
时,它最终运行查询,但它没有显示任何数据,而且我知道过去 30 天内有安装,所以我认为日期仍然是不被认可。
编辑InstallDate0 列是 nvarchar。
最佳答案
转换为 date
、datetime2
和 datetimeoffset
时,您不需要 YYYYMMDD 的转换格式。在这些情况下,SQL Server 无需转换即可识别此 ISO 标准格式,无论国际化设置如何(有一个设置会影响我的首选格式 YYYY-MM-DD;文档为 here )。所以,你可以这样做:
where cast(arp.InstallDate0 as date) > dateadd(day, -30, getdate())
此时:“你将日期存储为字符串真是太遗憾了。”
也就是说,(在您的情况下)最好将比较作为字符串而不是日期进行。您有一个很好的日期格式,因此:
where arp.InstallDate0 > convert(varchar(8), dateadd(day, -30, getdate()), 112)
为什么这样更好?由于列名上没有函数,查询可以利用适当的索引(如果有)。
关于sql - 无法将 YYYYMMDD 转换为日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32890403/