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.
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+00TIMESTAMP 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?
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
- Päivämäärälaskenta ja INTERVAL
- EXTRACT, DATE_TRUNC, AGE
- Aikavyöhykkeet: TIMESTAMP vs TIMESTAMPTZ
- Yleiset päivämääräraportit (MTD, WoW, YoY)