sql >> Databasteknik >  >> RDS >> PostgreSQL

PostgreSQL/JDBC och TIMESTAMP kontra TIMESTAMPTZ

Använd i allmänhet TIMESTAMPTZ

Här är råd från David E. Wheeler, en Postgres-expert, i ett blogginlägg vars titel säger allt:
Använd alltid TIDSTÄMPEL MED TIDZON (TIMESTAMPTZ)

Om du spårar faktiska ögonblick, specifika punkter på tidslinjen, använd TIMESTAMP WITH TIME ZONE .

Ett undantag:partitionering

Wheelers enda undantag är vid partitionering på tidsstämplar, på grund av tekniska begränsningar. Ett sällsynt undantag för de flesta av oss.

För information om partitionering, se doc och se Wiki .

Felbenämning

Datatypnamnen timestamp with time zone och timestamp without time zone är felaktiga benämningar. I båda I de fall datum-tid-värdet lagras i UTC (ingen tidszonförskjutning). Läs den föregående meningen igen. UTC, alltid. Frasen "med tidszon" betyder "med uppmärksamhet på tidszonen", inte "lagra tidszonen bredvid detta värde". Skillnaden mellan typerna är om någon tidszon ska tillämpas antingen under lagring (INSERT eller UPDATE) eller hämtning (SELECT-fråga). (Detta beteende beskrivs för Postgres -- Andra databaser varierar stort i detta avseende.)

Mer exakt bör man säga att TIMESTAMP WITHOUT TIME ZONE lagrar datum-tid-värden utan tidszon. Men utan någon tidsramsreferens skulle alla som tittar på dessa data behöva anta (hoppas, be?) att värdena är UTC. Men återigen, tråkigt eftersom du nästan aldrig ska använda den här typen.

Läs dokumentet noggrant och experimentera lite för att klargöra din förståelse.

Ozonad

Om du vill lagra den allmänna idén om en möjlig tid snarare än ett specifikt ögonblick, använd den andra typen, TIMESTAMP WITHOUT TIME ZONE .

Till exempel börjar julen i år den första stunden den 25 december 2017. Det skulle vara 2017-12-25T 00:00:00 utan tidszonsindikator eller offset-från-UTC. Detta värde är bara en vag uppfattning om möjliga ögonblick. Det har ingen betydelse förrän vi tillämpar en tidszon (eller offset). Så vi lagrar detta med TIMESTAMP WITHOUT TIME ZONE .

Tomtens bemannar tomtens logistikavdelning för speciella evenemang tillämpa tidszonerna som en del av deras planeringsprocess. Den tidigaste tidszonen är för närvarande Pacific/Kiribati , 14 timmar före UTC. Tomten planerar tomtens första ankomst dit. Alverna schemalägger en färdplan som tar renarna vidare till andra tidszoner där midnatt kommer strax efter, till exempel Pacific/Auckland . De fortsätter att gå västerut när varje zons midnatt anländer. Timmar senare i Asia/Kolkata , ännu senare i Europe/Paris , ännu fler timmar senare i America/Montreal och så vidare.

Var och en av dessa specifika leveransögonblick skulle registreras av alverna med WITH TIME ZONE , medan den allmänna idén om jul skulle lagras som WITHOUT TIME ZONE .

En annan användning i företagsappar för WITHOUT TIME ZONE schemalägger möten längre ut än flera veckor. Politiker runt om i världen har en oförklarlig förkärlek för att bråka med klockan och omdefiniera tidszonsregler. De går med sommartid (DST), lämnar sommartid, startar sommartid på ett annat datum eller avslutar sommartid på ett annat datum, eller ställer om klockan med 15 minuter eller en halvtimme. Alla dessa har gjorts under de senaste åren av Turkiet, USA, Ryssland, Venezuela och andra.

Politikerna gör ofta dessa förändringar med liten förvarning. Så om du schemalägger ett tandläkarbesök för sex månader kl. 13:00, bör det förmodligen lagras som TIMESTAMP WITHOUT TIME ZONE eller på annat sätt kan politikerna i praktiken ändra din tid till kl. 12.00, 14.00 eller 13.30.



  1. Diagnostisera dödlägen i SQL Server 2005

  2. Kontrollera om raden finns, Laravel

  3. Kan inte lagra UTF8-tecken i MySQL

  4. Varför kan jag inte använda min Oracle användardefinierade typ så här?