sql >> Database >  >> RDS >> PostgreSQL

PostgreSQL/JDBC en TIMESTAMP versus TIMESTAMPTZ

Gebruik TIMESTAMPTZ over het algemeen

Hier is advies van David E. Wheeler, een Postgres-expert, in een blogpost waarvan de titel alles zegt:
Gebruik altijd TIMESTAMP MET TIJDZONE (TIMESTAMPTZ)

Als u actuele momenten, specifieke punten op de tijdlijn bijhoudt, gebruikt u TIMESTAMP WITH TIME ZONE .

Eén uitzondering:partitionering

De enige uitzondering van Wheeler is bij het partitioneren op tijdstempels, vanwege technische beperkingen. Een zeldzame uitzondering voor de meesten van ons.

Zie doc voor informatie over partitionering. en zie de Wiki .

verkeerde benaming

De datatypes namen timestamp with time zone en timestamp without time zone zijn verkeerde namen. In beide gevallen wordt de datum-tijd-waarde opgeslagen in UTC (geen tijdzone-offset). Lees die vorige zin nog eens. UTC, altijd. De uitdrukking "met tijdzone" betekent "met aandacht voor tijdzone", niet "de tijdzone naast deze waarde opslaan". Het verschil tussen de typen is of een tijdzone moet worden toegepast tijdens opslag (INSERT of UPDATE) of ophalen (SELECT-query). (Dit gedrag wordt beschreven voor Postgres -- Andere databases variëren sterk in dit opzicht.)

Om precies te zijn, zou men moeten zeggen dat TIMESTAMP WITHOUT TIME ZONE datum-tijdwaarden zonder tijdzone opslaat. Maar zonder enige tijdskaderreferentie zou iedereen die naar die gegevens kijkt, moeten aannemen (hoop, bidden?) dat de waarden UTC zijn. Maar nogmaals, betwist dat je dit type bijna nooit zou moeten gebruiken.

Lees het document en experimenteer een beetje om je begrip te verduidelijken.

Niet toegestaan

Als je het algemene idee van een mogelijke tijd wilt opslaan in plaats van een specifiek moment, gebruik dan het andere type, TIMESTAMP WITHOUT TIME ZONE .

Kerstmis begint dit jaar bijvoorbeeld op het eerste moment van 25 december 2017. Dat zou 2017-12-25T 00:00:00 zijn. zonder indicatie van tijdzone of offset-van-UTC. Deze waarde is slechts een vaag idee over mogelijke momenten. Het heeft geen betekenis totdat we een tijdzone (of offset) toepassen. Dus we slaan dit op met behulp van TIMESTAMP WITHOUT TIME ZONE .

De elven die de Logistieke afdeling Speciale Evenementen van de Kerstman bemannen de tijdzones toepassen als onderdeel van hun planningsproces. De vroegste tijdzone is momenteel Pacific/Kiribati , 14 uur voor UTC. De elven plannen de eerste aankomst van de Kerstman daar. De elven plannen een vluchtplan dat de rendieren naar andere tijdzones brengt waar middernacht kort daarna komt, zoals Pacific/Auckland . Ze gaan verder naar het westen als de middernacht van elke zone aanbreekt. Uren later in Asia/Kolkata , nog later in Europe/Paris , nog meer uren later in America/Montreal enzovoort.

Elk van deze specifieke leveringsmomenten zou door de elven worden vastgelegd met behulp van WITH TIME ZONE , terwijl dat algemene idee van Kerstmis zou worden opgeslagen als WITHOUT TIME ZONE .

Een ander gebruik in zakelijke apps voor WITHOUT TIME ZONE maakt afspraken die verder weg liggen dan enkele weken. Politici over de hele wereld hebben een onverklaarbare voorliefde voor het knoeien met de klok en het herdefiniëren van tijdzoneregels. Ze sluiten zich aan bij de zomertijd (DST), verlaten de zomertijd, beginnen de zomertijd op een andere datum of eindigen de zomertijd op een andere datum, of verschuiven hun klok met 15 minuten of een half uur. Al deze zijn de afgelopen jaren gedaan door Turkije, de Verenigde Staten, Rusland, Venezuela en anderen.

De politici maken deze veranderingen vaak met weinig waarschuwing vooraf. Dus als u een tandartsafspraak plant voor zes maanden om 13:00 uur, moet dat waarschijnlijk worden opgeslagen als TIMESTAMP WITHOUT TIME ZONE of anders kunnen de politici uw afspraak in feite wijzigen naar 12.00 uur, of 14.00 uur of 13.30 uur.



  1. Vervang niet-ASCII-tekens in MYSQL

  2. Referentie-alias (berekend in SELECT) in WHERE-component

  3. Hoe utf-8 mb4-teken (emoji in ios5) in mysql in te voegen?

  4. Variabele gebruiken in SQL LIKE-instructie