Sql server ISDate在SQL server中未按预期工作

Sql server ISDate在SQL server中未按预期工作,sql-server,date,Sql Server,Date,在上面的代码中,我有一个2000年的@var值,它不是日期。但是如果我使用isdate函数进行检查,它会将其标记为有效日期 我们能做些什么来获得预期的产出 提前感谢您可以在案例陈述中添加一个额外的保护条款,要求@var长度超过7个字符('2000-1-1') 选择LEN(@VAR)>7且ISDATE(@VAR)=1时的情况,然后选择“有效日期” 当LEN(@var)

在上面的代码中,我有一个2000年的
@var
值,它不是日期。但是如果我使用
isdate
函数进行检查,它会将其标记为有效日期

我们能做些什么来获得预期的产出


提前感谢

您可以在案例陈述中添加一个额外的保护条款,要求@var长度超过7个字符('2000-1-1')

选择LEN(@VAR)>7且ISDATE(@VAR)=1时的情况,然后选择“有效日期”
当LEN(@var)<8或ISDATE(@var)=0时,“无效日期”结束

我发现了一件有趣的事情,希望这对你有所帮助

如果表达式是有效的日期、时间或日期时间值,则返回1;否则为0。

如果表达式是datetime2值,ISDATE
返回0。

如果你运行这个

select case when LEN(@VAR) > 7 and ISDATE(@var)=1 then 'Valid Date' 
            when LEN(@var) < 8 or  ISDATE(@var)=0 then 'Invalid Date' END 
Declare @var varchar(100)
set @var  = '1753'

select cast(@var as datetime)

select 
    case when ISDATE(@var) = 1 
           then 'Valid Date' 
         when ISDATE(@var) = 0 
           then 'Invalid Date' 
    end
结果

如果你运行这个

select case when LEN(@VAR) > 7 and ISDATE(@var)=1 then 'Valid Date' 
            when LEN(@var) < 8 or  ISDATE(@var)=0 then 'Invalid Date' END 
Declare @var varchar(100)
set @var  = '1753'

select cast(@var as datetime)

select 
    case when ISDATE(@var) = 1 
           then 'Valid Date' 
         when ISDATE(@var) = 0 
           then 'Invalid Date' 
    end
错误:导致varchar数据类型转换为datetime数据类型 在超出范围的值中


因为日期范围是1753年1月1日到9999年12月31日在您的情况下,当您运行的查询实际上是
ISDATE('2000-01-01 00:00:00.000')
有效的ISDATE假设它是DATETIME。

SQL Server不同意您的解释-
选择CONVERT(Date,'2000')
运行时没有错误。因此,就SQL Server而言,
2000
是一个日期。