sql >> Database teknologi >  >> RDS >> PostgreSQL

PostgreSQL/JDBC og TIMESTAMP vs. TIMESTAMPTZ

Brug generelt TIMESTAMPTZ

Her er råd fra David E. Wheeler, en Postgres-ekspert, i et blogindlæg, hvis titel siger det hele:
Brug altid TIMESTAMP MED TIDSZONE (TIMESTAMPTZ)

Hvis du sporer faktiske øjeblikke, specifikke punkter på tidslinjen, skal du bruge TIMESTAMP WITH TIME ZONE .

Én undtagelse:Partitionering

Wheelers eneste undtagelse er, når der partitioneres på tidsstempler på grund af tekniske begrænsninger. En sjælden undtagelse for de fleste af os.

For information om partitionering, se doc og se Wiki .

Fejlbetegnelse

Datatypernes navne timestamp with time zone og timestamp without time zone er forkerte betegnelser. I begge I tilfælde af at dato-tidsværdien er gemt i UTC (ingen tidszoneforskydning). Læs den forrige sætning igen. UTC, altid. Udtrykket "med tidszone" betyder "med opmærksomhed på tidszonen", ikke "lagre tidszonen ved siden af ​​denne værdi". Forskellen mellem typerne er, om en tidszone skal anvendes enten under lagring (INSERT eller UPDATE) eller hentning (SELECT-forespørgsel). (Denne adfærd er beskrevet for Postgres -- Andre databaser varierer meget i denne henseende.)

Mere præcist bør man sige, at TIMESTAMP WITHOUT TIME ZONE gemmer dato-tidsværdier uden tidszone. Men uden nogen tidsrammereference ville enhver, der kigger på disse data, skulle antage (håbe, bede?), at værdierne er UTC. Men igen, tøv, da du næsten aldrig bør bruge denne type.

Læs dokumentet omhyggeligt, og eksperimenter lidt for at afklare din forståelse.

Uzoneinddelt

Hvis du vil gemme den generelle idé om et muligt tidspunkt i stedet for et specifikt øjeblik, skal du bruge den anden type, TIMESTAMP WITHOUT TIME ZONE .

For eksempel starter julen i år i det første øjeblik den 25. december 2017. Det ville være 2017-12-25T 00:00:00 uden indikator for tidszone eller offset-fra-UTC. Denne værdi er kun en vag idé om mulige øjeblikke. Det har ingen betydning, før vi anvender en tidszone (eller offset). Så vi gemmer dette ved hjælp af TIMESTAMP WITHOUT TIME ZONE .

Nisserne bemander julemandens logistikafdeling for særlige begivenheder anvende tidszonerne som en del af deres planlægningsproces. Den tidligste tidszone er i øjeblikket Pacific/Kiribati 14 timer før UTC. Nisserne planlægger julemandens første ankomst der. Elverne planlægger en flyveplan, der tager rensdyrene videre til andre tidszoner, hvor midnat kommer kort efter, såsom Pacific/Auckland . De fortsætter med at gå vestpå, når hver zones midnat ankommer. Timer senere i Asia/Kolkata , stadig senere i Europe/Paris , endnu flere timer senere i America/Montreal og så videre.

Hvert af disse specifikke leveringsmomenter vil blive registreret af elverne ved hjælp af WITH TIME ZONE , mens den generelle idé om jul ville blive gemt som WITHOUT TIME ZONE .

En anden anvendelse i business-apps til WITHOUT TIME ZONE planlægger aftaler længere ude end flere uger. Politikere verden over har en uforklarlig forkærlighed for at rode med uret og omdefinere tidszonereglerne. De tilslutter sig sommertid (DST), forlader sommertid, starter sommertid på en anden dato eller afslutter sommertid på en anden dato eller skifter deres ur med 15 minutter eller en halv time. Alle disse er blevet udført i de sidste mange år af Tyrkiet, USA, Rusland, Venezuela og andre.

Politikerne foretager ofte disse ændringer med lidt forvarsel. Så hvis du planlægger en tandlægetid i seks måneder ud kl. 13:00, skal det sandsynligvis gemmes som TIMESTAMP WITHOUT TIME ZONE eller på anden måde ændrer politikerne muligvis din aftale til middag, 14:00 eller 13:30.



  1. Opdater sammenføjet tabel via SQLAlchemy ORM ved hjælp af session.query

  2. hvordan man ekko specialtegn som åäö med utf8

  3. Sådan viser du tabeller i den aktuelle database ved hjælp af PostgreSQL

  4. Hvad er der galt med denne MySQL-sætning:DECLARE @ID INT