2013-05-03 13 views
8

Sto usando SQL Server 2012Controllare se il valore è la data e convertirlo

ricevo i dati in un certo formato. date sono numerica (8,0)
Ad esempio 20120101 = YYYYMMDD

Esiste righe con valori come (0,1,2,3,6) in quel campo data, quindi non la data.

Voglio verificare se è una data e convertirla, altrimenti può essere nullo.

Ora il seguente codice funziona, ma speravo che ci fosse un modo migliore.

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

Qualsiasi aiuto sarà apprezzato.

risposta

18

funzione d'uso IsDate come ..

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

È possibile utilizzare la funzione ISDATE, ma cosa fare per i valori non di data? Nella mia proposta di soluzione è possibile scegliere di restituire un nulla:

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

Si può andare con 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

Restituisce 1 se l'espressione è un valore di data, ora o datetime valido; altrimenti, 0. ISDATE restituisce 0 se l'espressione è un valore datetime2.

Please visit

Problemi correlati