sql >> Database >  >> RDS >> Sqlserver

beste manier om een ​​datumreeks te converteren en te valideren

Allereerst, aangezien u SQL Server 2005 gebruikt, moet u uw code plaatsen die misschien mislukken in BEGIN TRY.....END TRY BEGIN CATCH....END CATCH blokken - probeer/vang blokken voor T-SQL!

Ten tweede zou ik voor alle datummanipulaties altijd gebruik de ISO-8601-indeling die werkt ongeacht de huidige datumindeling in SQL Server.

ISO-8601-indeling is YYYYMMDD voor alleen data, of YYYY-MM-DDTHH:MM:SS voor datum met tijd - dus ik zou je code schrijven als:

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

Vertrouw niet op het instellen van een bepaald datumformaat!! Stuur me je code en ik probeer het op een Zwitsers-Duits systeem - ik garandeer je bijna dat het zal breken als je blindelings "en-US" en dus "mm/dd/yyyy" aanneemt - het is niet overal op deze planeet dezelfde instelling.

Helaas is SQL Server nogal zwak voor het verwerken van datums - misschien is dat een uitbreidingspunt waar het gebruik van een CLR-assembly in SQL Server logisch zou zijn, om gebruik te maken van de veel rijkere datumverwerkingsfuncties in .NET ??

Marc

PS:lijkt het ISO-8601-formaat waarvan ik wist dat JJJJ-MM-DD niet altijd werkt in SQL Server - in tegenstelling tot wat Books Online lijkt te prediken. Gebruik in plaats daarvan JJJJMMDD of JJJJ-MM-DDTHH:MM:SS.
Bedankt, gbn!



  1. Partijrelatiepatroon. Hoe relaties te modelleren

  2. Oracle-uitvoerparameters retourneren vanuit een opgeslagen procedure in .NET

  3. Wat is er nieuw in PgBouncer 1.6

  4. Aanmeldingstriggers in SQL Server