sql - 无法将 YYYYMMDD 转换为日期

标签 sql sql-server-2008

我正在尝试查看过去 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。

最佳答案

转换为 datedatetime2datetimeoffset 时,您不需要 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/

相关文章:

sql - ORA-00920 : invalid relational operator

c# - '.' SQL INSERT c# 附近的语法不正确

sql - 在postgres中按日期合并多个值组

sql - SQL Server 使用分区删除重复项

sql - 选择 2 列中具有重复值的行

mysql - 尝试优化查询并正确索引表

sql - 将 Sybase ASE 特定的 *= 和 =* 转换为 LEFT/RIGHT OUTER JOIN

c# - 初始化字符串的格式不符合从索引 0 开始的规范

sql-server - 通过合并语句记录操作的最佳方法,可能具有识别 TSQL 错误的能力

PHP/SQL 投票和统计结果