2013-05-03 9 views
8

Używam SQL Server 2012Sprawdź, czy wartość jest data i przekształcić go

mogę odbierać dane w określonym formacie. terminy są numerycznymi (8,0)
Przykładowo 20120101 = YYYYMMDD

Istnieje rzędy z wartości takich jak (0,1,2,3,6) w tym polu daty, a więc nie data.

Chcę sprawdzić, czy jest to data i przekonwertować, w przeciwnym razie może być zerowa.

Teraz działa poniższy kod, ale miałem nadzieję, że jest lepszy sposób.

(CASE WHEN [invoice_date] LIKE '________' --There are 8 underscores 
THEN convert(datetime, cast([invoice_date] as char(8))) 
END) AS Invoice_Date 

Każda pomoc zostanie doceniona.

Odpowiedz

18

użycie ISDATE funkcję jak ..

(CASE WHEN ISDATE (invoice_date) = 1 
      THEN convert(datetime, cast([invoice_date] as char(8))) 
      END) AS Invoice_Date 
3

Możesz użyć funkcji ISDATE, ale co zrobiłbyś dla wartości innych niż daty? W moim sugerowanej rozwiązania można wybrać, aby powrócić null:

select 
    (case 
     when ISDATE (invoice_date)=1 
     then convert(datetime, invoice_date) 
    else null end) AS Invoice_Date 
from your_table 
0

Możesz iść z TRYCATCH

DECLARE @Source    char(8) 
DECLARE @Destination  datetime 

set @Source='07152009' 
BEGIN TRY 
    SET @Destination=CONVERT(datetime,RIGHT(@Source,4)  -- YYYY 
             +LEFT(@Source,2)  -- MM 
             +SUBSTRING(@Source,3,2) -- DD 
          ) 
END TRY 
BEGIN CATCH 
    PRINT 'ERROR!!!' 
END CATCH 

SELECT @Source AS Source, @Destination AS Destination 
2

ISDATE

Zwraca 1, jeśli wyrażenie jest poprawną datą, czasem lub wartością datetime; w przeciwnym razie 0. ISDATE zwraca 0, jeśli wyrażenie jest wartością datetime2.

Please visit