Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

meilleur moyen de convertir et de valider une chaîne de date

Tout d'abord, puisque vous utilisez SQL Server 2005, vous devez mettre votre code qui pourrait échouer dans BEGIN TRY.....END TRY BEGIN CATCH....END CATCH blocs - blocs try/catch pour T-SQL !

Deuxièmement, pour toute manipulation de date, je ferais toujours utilisez le format ISO-8601 qui fonctionnera quel que soit le format de date actuel défini dans SQL Server.

Le format ISO-8601 est YYYYMMDD pour les dates uniquement, ou YYYY-MM-DDTHH:MM:SS pour la date avec l'heure - donc j'écrirais votre code comme suit :

BEGIN TRY
  SET @Source='07152009'
  SET @Temp = RIGHT(@Source, 4) +             -- YYYY
              LEFT(@Source, 2) +              -- MM
              SUBSTRING(@Source, 3, 2)        -- DD

  IF ISDATE(@Temp)!=1
  BEGIN
      RAISERROR('ERROR, invalid date',16,1)
  END

  SET @Destination = CAST(@Temp AS DATETIME)
END TRY
BEGIN CATCH
      -- handle error if something bombs out
END CATCH

Ne vous fiez pas à la définition d'un format de date particulier !! Envoyez-moi votre code et je l'essayerai sur un système suisse-allemand - je garantis presque qu'il se cassera si vous supposez aveuglément "en-US" et donc "mm/jj/aaaa" - ce n'est pas le même décor partout sur cette planète.

Malheureusement, SQL Server est plutôt faible pour gérer les dates - peut-être que cela pourrait être un point d'extension où l'utilisation d'un assembly CLR dans SQL Server aurait du sens, pour exploiter les fonctions de gestion des dates beaucoup plus riches dans .NET ??

Marc

PS:semble que le format ISO-8601, je savais que AAAA-MM-JJ ne fonctionne pas toujours dans SQL Server - contrairement à ce que Books Online semble prêcher. Utilisez plutôt AAAAMMJJ ou AAAA-MM-JJTHH:MM:SS.
Merci, gbn !