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.
utiliser la fonction isdate comme ..
(CASE WHEN ISDATE (invoice_date) = 1
THEN convert(datetime, cast([invoice_date] as char(8)))
END) AS Invoice_Date
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
[~ # ~] 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.
Vous pouvez aller avec TRY
CATCH
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