无法将YYYYMMDD转换为日期

时间:2015-10-01 14:41:08

标签: sql sql-server-2008

我正在尝试查看过去30天内安装的软件。我的日期格式为20150327。当我在where子句

中尝试以下条件时
and DateDiff(day,arp.InstallDate0,GetDate()) < 30

我收到以下错误消息:

  

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

我也尝试了以下内容并且没有成功:

CONVERT(varchar(8),arp.InstallDate0,112)

以及:

ISDATE(CONVERT(datetime,arp.InstallDate0,112))

当我添加ISDATE时,它最终运行查询,但它没有显示任何数据,我知道在过去30天内有安装,所以我认为日期仍未被识别

编辑 InstallDate0列为nvarchar。

4 个答案:

答案 0 :(得分:2)

您必须使用以下语法,因为CONVERT function的第一个参数是目标数据类型

CONVERT(datetime,'20150327',112)

答案 1 :(得分:2)

转换为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)

为什么这样更好?如果列名没有函数,则查询可以利用适当的索引(如果有的话)。

答案 2 :(得分:0)

尝试使用转换器转换格式,通过转换字符将其转换为日期/时间字符串,然后使用字符串将数字转换为更易用的格式并进行额外转换

CONVERT(日期时间,&#39; 20150327&#39; 112)

答案 3 :(得分:0)

您必须使用以下语法:

WHERE
    DATEDIFF(day, CONVERT(datetime, arp.InstallDate0, 112), GetDate()) < 30