Państwa doc MS że ISDATE()
SQL Server 2012 ISDATE()
Zwraca 1, jeśli wyrażenie jest ważna data, czas, wartość lub datetime; w przeciwnym razie 0
Dlaczego więc powraca 0
w poniższym przykładzie?
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)
powraca
0 1752-01-04 NULL 1752-01-04 NULL
zmienić datę na 1753 i ...
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
Należy zauważyć, że '17520401' * jest * poprawną wartością' DATETIME2', ale * nie * jest prawidłową wartością 'DATETIME', więc' ISDATE' nadal zwraca 0. Podejście "TRY_CONVERT" sugerowane przez Gordona obejmie tę sprawę poprawnie też. (A dokumentacja prawdopodobnie wymaga poprawek - '17520401' jest poprawną' DATĄ', ale nie widocznie "poprawną wartością daty", która jest błędna.) Prawdopodobnie zachowanie samego "ISDATE" nie zostanie zmienione z powodu obawy dotyczące kompatybilności wstecznej. –
http://stackoverflow.com/a/3310588/2975396 – TheGameiswar
Myślę, że to nie jest duplikat, dokumentacja stwierdza, że "zakres datetime to 1753-01-01 do 9999-12-31, a zakres danych daty to 0001-01-01 do 9999-12-31. I zwraca 'Zwraca 1, jeśli wyrażenie jest poprawną datą, czasem lub wartością daty/godziny; w przeciwnym razie 0.' – TheGameiswar