Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

modo migliore per convertire e convalidare una stringa di data

Prima di tutto, dato che stai usando SQL Server 2005, dovresti inserire il tuo codice che potrebbe fallisci in BEGIN TRY.....END TRY BEGIN CATCH....END CATCH blocchi - prova/cattura blocchi per T-SQL!

Secondo, per tutte le manipolazioni della data, lo farei sempre usa il formato ISO-8601 che funzionerà indipendentemente dal formato della data corrente impostato in SQL Server.

Il formato ISO-8601 è YYYYMMDD solo per le date o YYYY-MM-DDTHH:MM:SS per data e ora, quindi scriverei il tuo codice come:

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

Non fare affidamento sull'impostazione di un particolare formato di data !! Mandami il tuo codice e lo proverò su un sistema svizzero-tedesco - ti garantisco quasi che si romperà se assumi ciecamente "en-US" e quindi "mm/gg/aaaa" - non la stessa impostazione ovunque su questo pianeta.

Sfortunatamente SQL Server è piuttosto debole per la gestione delle date, forse questo potrebbe essere un punto di estensione in cui avrebbe senso utilizzare un assembly CLR all'interno di SQL Server, per sfruttare le funzioni di gestione della data molto più ricche in .NET??

Marco

PS:sembra che il formato ISO-8601 che sapevo AAAA-MM-GG non funziona sempre in SQL Server, contrariamente a quanto sembra predicare la documentazione in linea. Usa invece AAAAMMGG o AAAA-MM-GGTHH:MM:SS.
Grazie, GBN!