sql >> Base de Datos >  >> RDS >> Sqlserver

mejor manera de convertir y validar una cadena de fecha

En primer lugar, dado que está utilizando SQL Server 2005, debe poner su código que podría falla en BEGIN TRY.....END TRY BEGIN CATCH....END CATCH bloques - ¡intentar/atrapar bloques para T-SQL!

En segundo lugar, para toda manipulación de fechas, siempre use el formato ISO-8601 que funcionará independientemente del formato de fecha actual establecido en SQL Server.

El formato ISO-8601 es YYYYMMDD solo para fechas, o YYYY-MM-DDTHH:MM:SS para fecha con hora, entonces escribiría su código como:

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

¡No confíe en que se establezca ningún formato de fecha en particular! Envíeme su código y lo probaré en un sistema suizo-alemán. Casi le garantizo que se romperá si asume ciegamente "en-US" y, por lo tanto, "mm/dd/yyyy". No. fuerte> el mismo escenario en todas partes de este planeta.

Desafortunadamente, SQL Server es bastante débil en el manejo de fechas; tal vez ese podría ser un punto de extensión en el que tendría sentido usar un ensamblaje CLR dentro de SQL Server, para aprovechar las funciones de manejo de fechas mucho más ricas en .NET ??

Marc

PD:parece que el formato ISO-8601 que sabía YYYY-MM-DD no siempre funciona en SQL Server, al contrario de lo que parece predicar Books Online. Use AAAAMMDD o AAAA-MM-DDTHH:MM:SS en su lugar.
¡Gracias, gbn!