web-dev-qa-db-fra.com

Vérifiez si la valeur est la date et convertissez-la

Je reçois des données dans un certain format. Les dates sont numériques (8,0). Par exemple 20120101 = YYYYMMDD

Il existe des lignes avec des valeurs comme (0,1,2,3,6) dans ce champ de date, donc pas une date.

Je veux vérifier s'il s'agit d'une date et la convertir, sinon elle peut être nulle.

Maintenant, le code suivant fonctionne, mais j'espérais qu'il y avait une meilleure façon.

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

Toute aide serait appréciée.

12
Inus C

utiliser la fonction isdate comme ..

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

Vous pouvez utiliser la fonction ISDATE, mais que ferait-il pour les valeurs non datées? Dans ma solution suggérée, vous pouvez choisir de retourner un null:

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

[~ # ~] isdate [~ # ~]

Renvoie 1 si l'expression est une valeur de date, d'heure ou de date/heure valide; sinon, 0. ISDATE renvoie 0 si l'expression est une valeur datetime2.

Veuillez visiter

2
user2358092

Vous pouvez aller avec 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
0
kiriloff