我正在尝试查看过去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。
答案 0 :(得分:2)
您必须使用以下语法,因为CONVERT
function的第一个参数是目标数据类型
CONVERT(datetime,'20150327',112)
答案 1 :(得分:2)
转换为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)
为什么这样更好?如果列名没有函数,则查询可以利用适当的索引(如果有的话)。
答案 2 :(得分:0)
尝试使用转换器转换格式,通过转换字符将其转换为日期/时间字符串,然后使用字符串将数字转换为更易用的格式并进行额外转换
CONVERT(日期时间,&#39; 20150327&#39; 112)
答案 3 :(得分:0)
您必须使用以下语法:
WHERE
DATEDIFF(day, CONVERT(datetime, arp.InstallDate0, 112), GetDate()) < 30