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

bedste måde at konvertere og validere en datostreng

Først og fremmest, da du bruger SQL Server 2005, bør du indsætte din kode, der måske mislykkes i BEGIN TRY.....END TRY BEGIN CATCH....END CATCH blokke - prøv/fang blokke til T-SQL!

For det andet, for al datemanipulation, ville jeg altid brug ISO-8601-format, som vil fungere, uanset hvilket aktuelle datoformat der er indstillet i SQL Server.

ISO-8601-formatet er YYYYMMDD kun for datoer, eller YYYY-MM-DDTHH:MM:SS for dato med tid - så jeg ville skrive din kode 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

Stol ikke på, at et bestemt datoformat bliver sat!! Send mig din kode, så prøver jeg den på et schweizisk-tysk system - jeg garanterer næsten, at den går i stykker, hvis du blindt antager "en-US" og dermed "mm/dd/åååå" - det er ikke stærk> den samme indstilling overalt på denne planet.

Desværre er SQL Server temmelig svage håndteringsdatoer - det kan måske være et udvidelsespunkt, hvor det ville være fornuftigt at bruge en CLR-assembly inde i SQL Server til at udnytte de meget rigere datohåndteringsfunktioner i .NET ??

Marc

PS:Det ser ud til, at ISO-8601-formatet, jeg vidste, ÅÅÅÅ-MM-DD ikke altid virker i SQL Server - i modsætning til hvad Books Online synes at prædike. Brug ÅÅÅÅMMDD eller ÅÅÅÅ-MM-DDTHH:MM:SS i stedet.
Tak, gbn!



  1. MySQL Show Grants for alle brugere

  2. Sådan sikkerhedskopieres og gendanner du en PostgreSQL-database

  3. Forhindrer denne kode SQL-injektion?

  4. 2PL, streng vs streng model, er der nogen fordel?