2013-05-03 10 views
8

Ich verwende SQL Server 2012Überprüfen Sie, ob Valutatag ist und wandeln es

I-Daten in einem bestimmten Format empfangen. Daten sind numerisch (8,0)
Zum Beispiel 20120101 = YYYYMMDD

Es gibt Zeilen mit Werten wie (0,1,2,3,6) in diesem Datumsfeld, also kein Datum.

Ich möchte überprüfen, ob es ein Datum ist und es konvertieren, sonst kann es null sein.

Jetzt funktioniert der folgende Code, aber ich hoffte, dass es einen besseren Weg gibt.

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

Jede Hilfe wird geschätzt.

Antwort

18

Verwendung isdate Funktion wie ..

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

Sie können die ISDATE-Funktion verwenden, aber was würde für Nicht-Datumswerte tun? In meiner vorgeschlagene Lösung können Sie wählen, eine Null zurück:

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

Sie mit 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 gehen

Gibt 1 zurück, wenn der Ausdruck ein gültiges Datums-, Zeit- oder Datetime-Wert ist; andernfalls 0. ISDATE gibt 0 zurück, wenn der Ausdruck ein datetime2-Wert ist.

Please visit

Verwandte Themen