SQL Server 2012 ISDATE()

В документе MS указано, что ISDATE()

Возвращает 1, если выражение является допустимым значением даты, времени, или datetime; в противном случае 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)

возвращает

0   1752-01-04  NULL    1752-01-04  NULL

Измените дату на 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

Ответ 1

Как объясняется в документации, самое раннее значение datetime - "1753-01-01".

Я бы предположил, что вместо этого вы используете try_convert(). Это дает вам большую гибкость:

 try_convert(date, '17521231') is not null

Тип данных date возвращается в первый год.