SQL Academy · Oppitunti

Aikavyöhykkeet: TIMESTAMP vs TIMESTAMPTZ

Ymmärtäkää TIMESTAMP- ja TIMESTAMPTZ-tyyppien ero, muuntakaa arvoja AT TIME ZONE -lausekkeella ja tallentakaa UTC-aikaa käyttötarkoituksesta riippumattomia sovelluksia varten.

Oppitunti 3/413 vaihetta

Aikavyöhykkeet: TIMESTAMP vs TIMESTAMPTZ on ilmainen SQL Academy-oppitunti CoddyKitissä. Tämä on oppitunti 3/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu SQL Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. SQL Academy-kurssilla on yhteensä 4 oppituntia.

Kaksi aikaleimatyyppiä

PostgreSQL:ssa on KAKSI aikaleimatyyppiä:

  • TIMESTAMP — ”naiivi” aikaleima, ei tietoa aikavyöhykkeestä
  • TIMESTAMPTZ — aikaleima aikavyöhykkeellä (tallennetaan sisäisesti UTC-aikana)

Nyrkkisääntö: suosi TIMESTAMPTZ-tyyppiä tapahtumille ja TIMESTAMP-tyyppiä täysin abstrakteille ajoille, kuten ”kello 9.00 työaikana”.

Miten TIMESTAMPTZ toimii

Arvo tallennetaan sisäisesti aina UTC-aikana. INSERT-lauseessa syöte muunnetaan istunnon aikavyöhykkeeltä UTC-ajaksi. SELECT-lauseessa tulos muunnetaan takaisin istunnon aikavyöhykkeelle.

SET TIME ZONE 'Europe/Berlin';
INSERT INTO events (ts) VALUES ('2024-03-15 12:00:00');
-- stored as 2024-03-15 11:00:00 UTC (Berlin is UTC+1 in winter)

SET TIME ZONE 'UTC';
SELECT ts FROM events;
-- 2024-03-15 11:00:00+00

TIMESTAMP hukkaa tietoa

Tavallinen TIMESTAMP ei sisällä tietoa aikavyöhykkeestä. ”2024-03-15 12:00:00” voi tarkoittaa mitä tahansa paikallista aikaa. Kun käyttäjät siirtyvät toisille aikavyöhykkeille, merkitys katoaa.

AT TIME ZONE

Muunna aikavyöhykkeiden välillä näyttämistä varten:

SELECT ts AT TIME ZONE 'America/New_York' AS ny_time FROM events;
SELECT ts AT TIME ZONE 'Asia/Tokyo'        AS tokyo_time FROM events;

UTC-ajan tallentaminen ja paikallisajan näyttäminen

Paras käytäntö: tallenna TIMESTAMPTZ-arvo ja muunna se käyttäjän aikavyöhykkeelle SELECT-lauseessa, ei koskaan päinvastoin.

SELECT id,
       ts AT TIME ZONE COALESCE(u.tz, 'UTC') AS local_ts
FROM events e
JOIN users u ON u.id = e.user_id;

SESSION TIME ZONE

Voit asettaa sen istunto-, käyttäjä- tai yleisellä tasolla:

-- Session:
SET TIME ZONE 'Europe/Berlin';

-- Per-user (PG):
ALTER ROLE alice SET timezone TO 'Europe/Berlin';

-- Server default in postgresql.conf:
-- timezone = 'UTC'

Aikavyöhykkeen ilmoittaminen literaalissa

Upota aikavyöhyke literaaliin:

SELECT TIMESTAMPTZ '2024-03-15 12:00:00 Europe/Berlin';
SELECT '2024-03-15 12:00:00+02'::TIMESTAMPTZ;

NOW() palauttaa TIMESTAMPTZ-arvon

NOW() ja CURRENT_TIMESTAMP palauttavat aina TIMESTAMPTZ-arvon. Niiden sekoittaminen TIMESTAMP-sarakkeisiin on yleinen virhe.

Milloin TIMESTAMP (ilman aikavyöhykettä) on oikea valinta

Käytä TIMESTAMP-tyyppiä (tai TIME-tyyppiä) abstrakteille tai paikallisille ajoille, jotka eivät aidosti riipu aikavyöhykkeestä — esimerkiksi ”myymälä avautuu kello 09.00”.

CREATE TABLE store_hours (
  store_id BIGINT,
  open_at  TIME NOT NULL,
  close_at TIME NOT NULL
);

Kesäaikasiirtymät

TIMESTAMPTZ käsittelee kesäajan automaattisesti. INTERVAL-arvon lisääminen toimii seinäkellon tuntien mukaan, paitsi jos ylität kesäajan rajan — silloin aika voi siirtyä 23 tai 25 tuntia.

SELECT TIMESTAMPTZ '2024-03-30 23:00:00 Europe/Berlin' + INTERVAL '5 hours';
-- Result accounts for the DST transition on March 31

Älä tallenna siirtymiä, vaan aikavyöhykkeiden nimiä

Siirtymä, kuten +02:00, ei kerro, milloin kesäaika alkaa. Aikavyöhykkeen nimi, kuten Europe/Berlin, kertoo sen. Kun tallennat käyttäjän kotiaikavyöhykkeen, tallenna IANA-nimi.

Kertaus

Käytä oletuksena TIMESTAMPTZ-tyyppiä tapahtumille.

  • Tallennetaan UTC-aikana, näytetään istunnon aikavyöhykkeellä
  • Muunna näyttämistä varten AT TIME ZONE -lauseella
  • Käytä TIMESTAMP-tyyppiä (ilman aikavyöhykettä) vain abstrakteille paikallisajoille

Pikatesti

Rakennat maailmanlaajuista SaaS-palvelua, joka kirjaa käyttäjien tapahtumat. Mitä aikaleimatyyppiä kannattaa käyttää occurred_at-sarakkeessa?

Aloita maksutta

Opi SQL tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
46
Oppitunnit
183

Usein kysytyt kysymykset

Onko oppitunti ”Aikavyöhykkeet: TIMESTAMP vs TIMESTAMPTZ” ilmainen?

Kyllä – oppitunnin ”Aikavyöhykkeet: TIMESTAMP vs TIMESTAMPTZ” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko SQL Academy-kurssin, päivitä CoddyKit PROhon. SQL Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Aikavyöhykkeet: TIMESTAMP vs TIMESTAMPTZ”?

Ymmärtäkää TIMESTAMP- ja TIMESTAMPTZ-tyyppien ero, muuntakaa arvoja AT TIME ZONE -lausekkeella ja tallentakaa UTC-aikaa käyttötarkoituksesta riippumattomia sovelluksia varten. Harjoittelet SQL Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni SQL Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin SQL Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 3/4.

Kuinka kauan ”Aikavyöhykkeet: TIMESTAMP vs TIMESTAMPTZ”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä SQL Academy-oppitunnilla?

Kyllä. Jokainen SQL Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Päivämäärälaskenta ja INTERVAL
  2. EXTRACT, DATE_TRUNC, AGE
  3. Aikavyöhykkeet: TIMESTAMP vs TIMESTAMPTZ
  4. Yleiset päivämääräraportit (MTD, WoW, YoY)
← Takaisin: SQL Academy