2016-12-05 12 views
12

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 
+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. –

+0

http://stackoverflow.com/a/3310588/2975396 – TheGameiswar

+2

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

Odpowiedz

13

Jak wyjaśniono w documentation, najwcześniej wartość datetime jest '1.01.1753'.

Proponuję zamiast tego użyć try_convert(). Daje to większą elastyczność:

try_convert(date, '17521231') is not null 

date typ danych sięga do jednego roku.

+2

Dokumentacja wyjaśnia również, że najwcześniejsza data to "while range for date data to 0001-01-01 do 9999-12-31", a ISDATE() doc mówi "Zwraca 1, jeśli wyrażenie jest prawidłową datą, czasem lub wartość datetime, w przeciwnym razie 0. " więc na pewno ISATE ('17520101') jest prawidłową datą? – Maurice1408

+0

nie było roku zero! – Cato