SQL Server 2012 ISDATE()

Mau*_*408 12 sql sql-server

MS文件说明了这一点 ISDATE()

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

那么为什么它会0在下面的例子中返回?

DECLARE @DT VARCHAR(30) = '1/4/1752'

SELECT 
    ISDATE(@DT),
    TRY_CONVERT(DATE, @DT, 101),
    TRY_CONVERT(DATETIME, @DT),
    TRY_CAST(@DT as DATE),  
    TRY_CAST(@DT AS DATETIME)
Run Code Online (Sandbox Code Playgroud)

回报

0   1752-01-04  NULL    1752-01-04  NULL
Run Code Online (Sandbox Code Playgroud)

将日期更改为1753和...

1   1753-01-04  1753-01-04 00:00:00.000 1753-01-04  1753-01-04 00:00:00.000

select ISDATE('17521231'), ISDATE('17530101') gives

0   1
Run Code Online (Sandbox Code Playgroud)

Gor*_*off 13

文档中所述,最早的datetime值为'1753-01-01'.

我建议你try_convert()改用.这为您提供了更多灵活性:

 try_convert(date, '17521231') is not null
Run Code Online (Sandbox Code Playgroud)

date数据类型可以追溯到一年.

  • 该文档还解释了最早的日期是"日期数据的范围是0001-01-01到9999-12-31"和ISDATE()doc说"如果表达式是有效的日期,时间或日期时间,则返回1值;否则为0." ISATE('17520101')肯定是有效的日期吗? (2认同)