Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

beste Weg, um eine Datumszeichenfolge zu konvertieren und zu validieren

Da Sie SQL Server 2005 verwenden, sollten Sie zuallererst Ihren Code so einfügen, dass vielleicht scheitern an BEGIN TRY.....END TRY BEGIN CATCH....END CATCH blocks - try/catch-Blöcke für T-SQL!

Zweitens würde ich bei aller Datumsmanipulation immer Verwenden Sie das ISO-8601-Format, das unabhängig davon funktioniert, welches aktuelle Datumsformat in SQL Server eingestellt ist.

Das ISO-8601-Format ist YYYYMMDD für nur Daten oder YYYY-MM-DDTHH:MM:SS für Datum mit Uhrzeit - also würde ich Ihren Code schreiben 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

Verlassen Sie sich nicht darauf, dass ein bestimmtes Datumsformat eingestellt ist!! Schicken Sie mir Ihren Code und ich probiere ihn auf einem schweizerisch-deutschen System aus - ich garantiere fast, dass er kaputt geht, wenn Sie blindlings "en-US" und damit "mm/dd/yyyy" annehmen - es ist nicht die gleiche Einstellung überall auf diesem Planeten.

Leider ist SQL Server ziemlich schwach im Umgang mit Datumsangaben - vielleicht könnte das ein Erweiterungspunkt sein, an dem die Verwendung einer CLR-Assembly innerhalb von SQL Server sinnvoll wäre, um die viel umfangreicheren Datumshandhabungsfunktionen in .NET zu erschließen ??

Markus

PS:Das ISO-8601-Format, von dem ich wusste, dass YYYY-MM-DD nicht immer in SQL Server funktioniert - im Gegensatz zu dem, was Books Online zu predigen scheint. Verwenden Sie stattdessen JJJJMMTT oder JJJJ-MM-TTTHH:MM:SS.
Danke, gbn!