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.
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:
CREATE TABLE table_name (
column_name TIMESTAMP WITH TIME ZONE,
...
);
Yozishni qisqartirish uchun uning qisqa shakli — TIMESTAMPTZ dan foydalanishingiz mumkin:
CREATE TABLE table_name (
column_name TIMESTAMPTZ,
...
);
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:
SET TIME ZONE 'Asia/Tashkent';
Amaliyotda turli davlatlar va mintaqalar bilan ishlovchi tizimlarda (xalqaro tranzaksiyalar, buyurtmalar, loglar) deyarli doimo TIMESTAMP o'rniga TIMESTAMPTZ ishlatiladi.
CURRENT_TIMESTAMP funksiyasi joriy sana va vaqtni vaqt mintaqasi bilan birga qaytaradi:
SELECT CURRENT_TIMESTAMP;
Natija:
current_timestamp
-------------------------------
2024-12-08 02:42:59.773965-08
Agar sessiya vaqt mintaqasini o'zgartirsak:
SET TIME ZONE 'America/New_York';
SELECT CURRENT_TIMESTAMP;
Natija Nyu-York vaqtiga moslashadi:
current_timestamp
-------------------------------
2024-12-08 05:43:11.587639-05
Qo'llab-quvvatlanadigan barcha vaqt mintaqalari ro'yxatini ko'rish uchun:
SELECT
name,
abbrev,
utc_offset,
is_dst
FROM
pg_timezone_names;
TIMESTAMPTZ ustuniga standart qiymat sifatida CURRENT_TIMESTAMP ni belgilash juda keng tarqalgan amaliyotdir:
CREATE TABLE table_name (
column_name TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP
);
Omborda mahsulotlar skanerlangan vaqtini qayd etib boruvchi inventory_scans jadvalini yaratamiz:
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:
INSERT INTO
inventory_scans (warehouse_id, product_id, serial_no, quantity)
VALUES
(1, 1, 'F2LZK3H8N72Q', 1),
(2, 1, 'R58N40Y1A2B3', 1)
RETURNING *;
Natija:
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
TIMESTAMPTZ (TIMESTAMP WITH TIME ZONE) dan foydalaning.CURRENT_TIMESTAMP funksiyasidan foydalaniladi.