2012-06-15 2 views
5

Wiem, że istnieje funkcja o nazwie isdate() do sprawdzania poprawności kolumn datetime, ale działa tylko dla typów smalldatetime i datetime. Pytanie brzmi: czy istnieje podobny sposób sprawdzania poprawności nowego typu danych datetime2 w serwerze sql 2008 i 2012?Czy istnieje funkcja taka jak isdate() dla datetime2?

+3

ściśle mówiąc ISDATE() nie zatwierdzić kolumny datetime; sprawdza poprawność, czy wyrażenie może być analizowane jako datetime. Po tym, jak jest w kolumnie, jest trochę za późno! –

+1

@MitchWheat to dobry punkt. Wydaje się, że istnieje większe prawdopodobieństwo sprawdzenia błędnie błędnie zapisanych dat w kolumnie varchar lub (b) parametrów wejściowych o niepoprawnym typie danych. –

+0

Chciałbym sprawdzić dane wejściowe z arkusza excel, który ma niektóre kolumny daty w tabeli tymczasowej. – Vladimir

Odpowiedz

12

W SQL Server 2012, można użyć TRY_CONVERT:

SELECT TRY_CONVERT(DATETIME2, '2012-02-02 13:42:55.2323623'), 
     TRY_CONVERT(DATETIME2, '2012-02-31 13:42:55.2323623'); 

Wyniki:

2012-02-02 13:42:55.2323623 NULL 

Albo TRY_PARSE: (. Same wyniki)

SELECT TRY_PARSE('2012-02-02 13:42:55.2323623' AS DATETIME2), 
     TRY_PARSE('2012-02-31 13:42:55.2323623' AS DATETIME2); 

Przepraszam, że nie mam mądrą odpowiedź na ciebie < 2012 roku można było, jak sądzę, powiedzieć

SELECT ISDATE(LEFT('2012-02-02 13:42:55.2323623', 23); 

Ale to wydaje się brudna.

TRY_CONVERT documentation on MSDN
TRY_PARSE documentation on MSDN

+0

fajny ................ –

+0

Sprytna odpowiedź! Podobało mi się to bardzo! Kolejne pytanie dotyczące datetime2 w serwerze sql 2008, czy istnieje sposób, aby sprawdzić poprawną datę, gdy wartość jest coś jak przed "1 stycznia 1753"? Użycie tego polecenia spowoduje wypisanie nieprawidłowej daty SELECT ISDATE (LEWEJ ('2012-02-02 13: 42: 55.2323623', 23)); – Vladimir

+0

@ Vladimir sorry Właśnie zauważyłem twoje pytanie. Czy to akademickie czy naprawdę masz daty <1753? –