2012-07-31 12 views
11

Używam instrukcji SQL przeciwko importowanym danym z plików Excel. W tym SQL sprawdzam, czy użytkownicy poprawnie wpisali daty za pomocą funkcji IsDate. Ponieważ jest to surowe dane, które nie zostały jeszcze przekształcone, wszystkie daty są przechowywane w polu typu danych varchar.Funkcja IsDate w SQL ocenia niepoprawne daty jako ważne

W niektórych okolicznościach IsDate zwraca 1 (poprawna data), gdy wyraźnie wprowadzono nieprawidłowy format daty wprowadzony przez użytkownika.

Dla przykładu:

07/001/2012 

2012-07-002 

007/002/2012 

Wszelkie sugestie, w jaki sposób poradzić sobie z tym problemem?

SELECT * 
    FROM tblImport 
WHERE (ISDATE(dt) = 0 
     AND (dt is not null AND dt <> '')) 

Dzięki!

p.s. Uderzanie użytkowników "nie pomogło.

+0

Nie C#. Widok SQL, który zwraca rekordy z nieprawidłowymi datami. – ssokol91

Odpowiedz

21

zrobić dużo pracy konwersji danych i tutaj jest funkcja, która stworzyłem i używać go praktycznie codziennie pozbyć się złych dat:

CREATE FUNCTION dbo.fnCheckDate 
(@InDate nvarchar(50)) 
RETURNS DATETIME 
AS 
    BEGIN 
     declare @Return DATETIME 

     select @return = CASE WHEN ISDATE(@InDate) = 1 
          THEN CASE WHEN CAST(@InDate as DATETIME) BETWEEN '1/1/1901 12:00:00 AM' AND '6/6/2079 12:00:00 AM' 
            THEN @InDate 
            ELSE null 
            END 
          ELSE null 
          END 
     return @return 
    END 
GO 

Rezultaty: Ustawienie

SELECT dbo.fnCheckDate('07/001/2012') --> Returns 2012-07-01 00:00:00.000 
SELECT dbo.fnCheckDate('2012-07-002') --> Returns 2012-07-01 00:00:00.000 
SELECT dbo.fnCheckDate('007/002/2012') --> Returns 2012-07-01 00:00:00.000 
SELECT dbo.fnCheckDate('00/002/2012') --> Returns Null 
SELECT dbo.fnCheckDate('006/031/2012') --> Returns Null 
SELECT dbo.fnCheckDate('') --> Returns Null 
+1

To jest świetne! Dzięki! – ssokol91

+2

+1 ale dlaczego kończysz na 1/2/2030 z SQL smalldatetime trafia 2079-06-06 – Paparazzi

+1

Ponieważ do 2030 będę długo martwy i pochowany (LOL)! Wszystkie dane, z którymi mam do czynienia, są historyczne, więc naprawdę nie muszę się martwić o przyszłe daty, ale świetny punkt. –

1

Może po prostu sprawdź dt LEN? nie może jednak obsługiwać przypadków, gdy len jest ważny. może sprawdzanie danych wejściowych powinno się zdarzyć w interfejsie?

+0

Sprawdzanie poprawności danych wejściowych było moją pierwszą linią obrony. Niestety, ponieważ wszystkie dane wprowadzane są w plikach Excel i wszyscy wiemy, jak nieostrożni mogą być użytkownicy, było to po prostu niemożliwe. – ssokol91

6

Try dateformat najpierw - to zadziałało dla mnie, gdy widziałem wyjątki.

set dateformat dmy 
select IsDate(<column>) 
from Table