47 / 100

TIMESTAMPTZ

Mintaqali sana va vaqt turi

Kirish: Ushbu qo'llanmada siz PostgreSQL TIMESTAMPTZ (TIMESTAMP WITH TIME ZONE) ma'lumot turi yordamida vaqt mintaqalarini hisobga oluvchi sana va vaqt qiymatlari bilan ishlashni o'rganasiz.

PostgreSQL TIMESTAMPTZ ma'lumot turiga kirish

PostgreSQLda vaqt mintaqalariga sezgir bo'lgan sana va vaqt qiymatlarini saqlash uchun TIMESTAMP WITH TIME ZONE ma'lumot turidan foydalaniladi.

Ushbu turni e'lon qilish sintaksisi:

query.sql
CREATE TABLE table_name (
  column_name TIMESTAMP WITH TIME ZONE,
  ...
);

Yozishni qisqartirish uchun uning qisqa shakli — TIMESTAMPTZ dan foydalanishingiz mumkin:

query.sql
CREATE TABLE table_name (
  column_name TIMESTAMPTZ,
  ...
);

TIMESTAMPTZ qanday ishlaydi?

  • Saqlashda: Siz qiymat kiritganingizda, PostgreSQL uni avtomatik ravishda UTC (nol mintaqa) vaqtiga o'giradi va bazada UTC shaklida saqlaydi. Bu orqali turli mintaqalardagi ma'lumotlar yagona standartga keltiriladi.
  • O'qishda: Ma'lumotlar tanlab olinganda, PostgreSQL UTC vaqtini joriy sessiyangizning vaqt mintaqasiga moslashtirib (konvertatsiya qilib) ko'rsatadi.

E'tibor bering: PostgreSQL ustunning o'zida vaqt mintaqasi matnini saqlamaydi, faqatgina saqlash va o'qish vaqtida mintaqa bo'yicha moslashuvni amalga oshiradi.

Sessiya vaqt mintaqasini SET TIME ZONE buyrug'i bilan o'zgartirish mumkin:

query.sql
SET TIME ZONE 'Asia/Tashkent';

Amaliyotda turli davlatlar va mintaqalar bilan ishlovchi tizimlarda (xalqaro tranzaksiyalar, buyurtmalar, loglar) deyarli doimo TIMESTAMP o'rniga TIMESTAMPTZ ishlatiladi.

Mintaqa bilan joriy vaqtni olish

CURRENT_TIMESTAMP funksiyasi joriy sana va vaqtni vaqt mintaqasi bilan birga qaytaradi:

query.sql
SELECT CURRENT_TIMESTAMP;

Natija:

matn
        current_timestamp
-------------------------------
 2024-12-08 02:42:59.773965-08

Agar sessiya vaqt mintaqasini o'zgartirsak:

query.sql
SET TIME ZONE 'America/New_York';
SELECT CURRENT_TIMESTAMP;

Natija Nyu-York vaqtiga moslashadi:

matn
        current_timestamp
-------------------------------
 2024-12-08 05:43:11.587639-05

Qo'llab-quvvatlanadigan barcha vaqt mintaqalari ro'yxatini ko'rish uchun:

query.sql
SELECT
  name,
  abbrev,
  utc_offset,
  is_dst
FROM
  pg_timezone_names;

Standart qiymat (DEFAULT) o'rnatish

TIMESTAMPTZ ustuniga standart qiymat sifatida CURRENT_TIMESTAMP ni belgilash juda keng tarqalgan amaliyotdir:

query.sql
CREATE TABLE table_name (
  column_name TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP
);

PostgreSQL TIMESTAMPTZ turiga misol

Omborda mahsulotlar skanerlangan vaqtini qayd etib boruvchi inventory_scans jadvalini yaratamiz:

query.sql
CREATE TABLE inventory_scans (
  scan_id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
  warehouse_id INT NOT NULL,
  product_id INT NOT NULL,
  serial_no VARCHAR(25) NOT NULL,
  quantity INT NOT NULL,
  scanned_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP
);

Jadvalga qatorlar kiritamiz:

query.sql
INSERT INTO
  inventory_scans (warehouse_id, product_id, serial_no, quantity)
VALUES
  (1, 1, 'F2LZK3H8N72Q', 1),
  (2, 1, 'R58N40Y1A2B3', 1) 
RETURNING *;

Natija:

matn
scan_id | warehouse_id | product_id |  serial_no   | quantity |          scanned_at
---------+--------------+------------+--------------+----------+-------------------------------
       1 |            1 |          1 | F2LZK3H8N72Q |        1 | 2024-12-08 05:44:11.998853-05
       2 |            2 |          1 | R58N40Y1A2B3 |        1 | 2024-12-08 05:44:11.998853-05

Xulosa

  • Vaqt mintaqasini hisobga oluvchi sana va vaqtni saqlash uchun TIMESTAMPTZ (TIMESTAMP WITH TIME ZONE) dan foydalaning.
  • PostgreSQL barcha qiymatlarni ichki UTC formatida saqlaydi va foydalanuvchiga uning sessiya mintaqasiga moslab qaytaradi.
  • Joriy vaqtni olish uchun CURRENT_TIMESTAMP funksiyasidan foydalaniladi.