Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

melhor maneira de converter e validar uma string de data


Em primeiro lugar, como você está usando o SQL Server 2005, você deve colocar seu código que pode falha em BEGIN TRY.....END TRY BEGIN CATCH....END CATCH blocos - blocos try/catch para T-SQL!

Segundo, para todas as manipulações de datas, eu sempre use o formato ISO-8601 que funcionará independentemente do formato de data atual definido no SQL Server.

O formato ISO-8601 é YYYYMMDD apenas para datas ou YYYY-MM-DDTHH:MM:SS para data com hora - então eu escreveria seu 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

Não confie em nenhum formato de data específico sendo definido! Envie-me seu código e eu vou testá-lo em um sistema suíço-alemão - eu quase garanto que ele vai quebrar se você assumir cegamente "en-US" e, portanto, "mm/dd/aaaa" - não forte> a mesma configuração em todos os lugares deste planeta.

Infelizmente, o SQL Server é bastante fraco para lidar com datas - talvez isso possa ser um ponto de extensão em que o uso de um assembly CLR dentro do SQL Server faria sentido, para explorar as funções de manipulação de data muito mais ricas no .NET ??

Marco

PS:parece que o formato ISO-8601 que eu sabia que YYYY-MM-DD nem sempre funciona no SQL Server - ao contrário do que os Books Online parecem pregar. Use YYYYMMDD ou YYYY-MM-DDTHH:MM:SS.
Obrigado, gbn!