sql >> Databasteknik >  >> RDS >> Sqlserver

bästa sättet att konvertera och validera en datumsträng

Först och främst, eftersom du använder SQL Server 2005 bör du lägga in din kod som kan misslyckas med BEGIN TRY.....END TRY BEGIN CATCH....END CATCH block - försök/fånga block för T-SQL!

För det andra, för all datummanipulation skulle jag alltid använd ISO-8601-format som fungerar oavsett vilket datumformat som är inställt i SQL Server.

ISO-8601-formatet är YYYYMMDD för bara datum, eller YYYY-MM-DDTHH:MM:SS för datum med tid - så jag skulle skriva din kod som:

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

Lita inte på att något speciellt datumformat ställs in!! Skicka mig din kod så ska jag prova den på ett schweizisk-tyskt system - jag garanterar nästan att den går sönder om du blint antar "en-US" och därmed "mm/dd/åååå" - det är det inte stark> samma miljö överallt på denna planet.

Tyvärr är SQL Server ganska svaga hanteringsdatum - kanske det kan vara en förlängningspunkt där det skulle vara meningsfullt att använda en CLR-sammansättning inuti SQL Server, för att utnyttja de mycket rikare datumhanteringsfunktionerna i .NET ??

Marc

PS:ISO-8601-formatet som jag visste ÅÅÅÅ-MM-DD verkar inte alltid fungera i SQL Server - i motsats till vad Books Online verkar predika. Använd ÅÅÅÅMMDD eller ÅÅÅÅ-MM-DDTHH:MM:SS istället.
Tack, se!



  1. Hur man skapar ett rullningsbart, uppdateringsbart ResultSet-objekt i JDBC

  2. MariaDB CONNECTION_ID() förklaras

  3. Ingen anslutning kunde göras eftersom målmaskinen aktivt vägrade det (PHP / WAMP)

  4. Vad är skillnaden mellan bindningsvariabler och substitutionsvariabler (som jag matar in med &&)?