SQL Server-IsDate函数返回意外结果

时间:2019-05-30 12:10:10

标签: sql sql-server sql-server-2012

我正在尝试做这样的事情

when ISDATE(u.NewValue)=1 then CONVERT(varchar,cast(u.NewValue as date),23)

但是sql server也为2406返回1,因为它也是一个日期,所以这是

select ISDATE('2406')

返回1。

情况并非如此。 因此,我得到像这样的2406-01-01输出,这是错误的。

应该如何检查该值是否实际上是日期,当我的数据将是日期时,它将以2019-05-28 07:59:04.450格式出现,因此我只想捕获这种类型的数据作为日期。

有人可以建议我这样做的方法

2 个答案:

答案 0 :(得分:2)

好吧,您可以使用like

select (case when col like '[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9] [0-9][0-9]:[0-9][0-9]:[0-9][0-9].[0-9][0-9][0-9]'
             then convert(datetime, col)
        end)

根据列的外观,可以放宽格式要求:

select (case when col like '%-%-% %:%:%.%'
             then try_convert(datetime, col)
        end)

SQL Server仅使用年份将其转换为日期,我感到很惊讶:

try_convert(date, '2019', 121)

格式可能不完整。

答案 1 :(得分:-1)

这项工作会吗?

when ISDATE(convert(date,u.NewValue))=1 then CONVERT(varchar,cast(u.NewValue as date),23)