Timestamp

Ushbu qo'llanmada siz PostgreSQL timestamp ma'lumotlar turlari, shu jumladan timestamp va timestamptz haqida bilib olasiz. Shuningdek, timestamptz ma'lumotlarini samarali boshqarish uchun ba'zi qulay funktsiyalardan qanday foydalanishni o'rganasiz.

PostgreSQL sizga vaqt belgilari bilan ishlash uchun ikkita vaqtinchalik ma'lumotlar turini taqdim etadi:

  • timestamp: vaqt mintaqasi bo'lmagan vaqt tamg'asi. * timestamptz: vaqt mintaqasi bilan vaqt tamg'asi.

timestamp maʼlumotlar turi sana va vaqtni saqlash imkonini beradi. Biroq, unda hech qanday vaqt mintaqasi ma'lumotlari yo'q. Bu shuni anglatadiki, ma'lumotlar bazasi serveringizning vaqt mintaqasini o'zgartirganingizda, ma'lumotlar bazasida saqlangan vaqt tamg'asi qiymati avtomatik ravishda o'zgarmaydi.

timestamptz maʼlumotlar turi — vaqt mintaqasi boʻlgan vaqt tamgʻasi. timestamptz ma'lumotlar turi - bu vaqt mintaqasidan xabardor sana va vaqt ma'lumotlari turi.

Ichki sifatida PostgreSQL timestamptz UTC qiymatida saqlaydi.

  • timestamptz ustuniga qiymat kiritganingizda, PostgreSQL timestamptz qiymatini UTC qiymatiga o'zgartiradi va UTC qiymatini jadvalda saqlaydi.

  • timestamptz ustunidan ma'lumotlarni olganingizda, PostgreSQL UTC qiymatini ma'lumotlar bazasi serveri, foydalanuvchi yoki joriy ma'lumotlar bazasi ulanishi tomonidan belgilangan vaqt mintaqasining vaqt qiymatiga qaytaradi.

Eʼtibor bering, timestamp ham, timestamptz ham quyidagi soʻrovda koʻrsatilganidek, vaqt tamgʻasi qiymatlarini saqlash uchun 8 baytdan foydalanadi:

SELECT 
  typname, 
  typlen 
FROM 
  pg_type 
WHERE 
  typname ~ '^timestamp';

Chiqish:

typname   | typlen
-------------+--------
 timestamp   |      8
 timestamptz |      8
(2 rows)

Shuni ta'kidlash kerakki, PostgreSQL timestamptz qiymatlarini UTC qiymatlaridan foydalangan holda ma'lumotlar bazasida saqlaydi. timestamptz qiymati bilan vaqt mintaqasi ma'lumotlarini saqlamaydi.

PostgreSQL timestamp misoli

Keling, PostgreSQL tomonidan qanday ishlashini yaxshiroq tushunish uchun timestamp va timestamptz dan foydalanish misolini ko'rib chiqaylik.

Birinchidan, timestamp ustunlarining ikkala timestamptzdan iborat jadval yarating.

Keyin maʼlumotlar bazasi serverining vaqt mintaqasini America/Los_Angelesga oʻrnating.

Aytgancha, siz joriy vaqt mintaqasini SHOW TIMEZONE buyrug'i yordamida ko'rishingiz mumkin:

Keyin timstamp_demo jadvaliga yangi qator kiriting:

Shundan so'ng, timestamp va timestamptz ustunlaridan ma'lumotlarni so'rang.

So'rov kiritilgan qiymatlar bilan bir xil vaqt tamg'asi qiymatlarini qaytaradi.

Nihoyat, joriy seansning vaqt mintaqasini America/New_York ga o'zgartiring va ma'lumotlarni qayta so'rang.

timestamp ustunidagi qiymat o'zgarmaydi, timestamptz ustunidagi qiymat esa "Amerika/Nyu_York"ning yangi vaqt mintaqasiga o'rnatiladi.

Umuman olganda, timestamptz ma'lumotlarini saqlash uchun vaqt tamg'asi ma'lumotlar turidan foydalanish yaxshi amaliyotdir.

PostgreSQL timestamp funksiyalari

timestamp ma'lumotlarini samarali boshqarish uchun PostgreSQL quyidagi kabi ba'zi qulay funktsiyalarni taqdim etadi:

Joriy vaqtni olish

Joriy vaqt tamg'asini olish uchun NOW() funksiyasidan quyidagi tarzda foydalanasiz:

Chiqish:

Shu bilan bir qatorda, siz CURRENT_TIMESTAMP funksiyasidan foydalanishingiz mumkin:

Chiqish:

Joriy vaqtni sanasiz olish uchun siz CURRENT_TIME funksiyasidan foydalanasiz:

Chiqish:

Esda tutingki, CURRENT_TIMESTAMP ham, CURRENT_TIME ham joriy vaqtni vaqt mintaqasi bilan qaytaradi.

Kunning vaqtini string formatida olish uchun siz timeofday() funksiyasidan foydalanasiz.

Vaqt mintaqalari oʻrtasida konvertatsiya qilish

Vaqt tamg'asini boshqa vaqt mintaqasiga aylantirish uchun siz timezone(zone, timestamp) funksiyasidan foydalanasiz.

Joriy vaqt mintaqasi Amerika/Nyu_York.

2016-06-01 00:00 ni Amerika/Los_Anjeles vaqt mintaqasiga aylantirish uchun siz timezone() funksiyasidan quyidagi tarzda foydalanasiz:

E'tibor bering, biz vaqt tamg'asini satr sifatida timezone() funksiyasiga o'tkazamiz, PostgreSQL uni bilvosita timestamptzga o'tkazadi. timestamp qiymatini timestamptz ma'lumotlar turiga quyidagi bayonot sifatida aniq ko'rsatish yaxshiroqdir:

Chiqish:

timestamp ustunlari uchun standart qiymatlardan foydalanish

Birinchidan, department deb nomlangan yangi jadval yarating:

created_at va updated_at ustunlari uchun standart qiymatlar CURRENT_TIMESTAMP funksiyasi tomonidan taqdim etilgan joriy vaqt tamg'asidir.

Ikkinchidan, created_at va updated_at ustunlari uchun qiymatlarni ko'rsatmasdan, department jadvaliga yangi qator qo'shing:

Chiqarish shuni ko'rsatadiki, PostgreSQL created_at va created_at ustunlariga kiritish uchun joriy vaqtdan foydalanadi.

Bo'lim jadvalidagi qatorni yangilaganingizda, updated_at ustuni joriy vaqtga avtomatik ravishda yangilanmaydi.

updated_at ustunidagi qiymatni satr yangilangan vaqtga yangilash uchun siz updated_at ustunidagi qiymatni o'zgartirish uchun BEFORE UPDATE triggerini yaratishingiz mumkin.

Esda tutingki, MySQL TIMESTAMP ustunini joriy vaqt tamg'asiga avtomatik yangilash uchun ON UPDATE CURRENT_TIMESTAMP ni taklif qiladi. PostgreSQL hozirda bu xususiyatni qo'llab-quvvatlamaydi.

Uchinchidan, department jadvalining updated_at ustunini yangilash uchun BEFORE UPDATE triggerini yarating:

To'rtinchidan, updated_at ustuniga qiymat ko'rsatmasdan IT bo'limi nomini ITD ga yangilang:

Chiqish:

Chiqish updated_at ustunidagi qiymat trigger tomonidan avtomatik ravishda yangilanganligini bildiradi.

Xulosa

  • Vaqt tamg'asi ma'lumotlarini saqlash uchun timestamp va timestamptzdan foydalaning

  • PostgreSQL ma'lumotlar bazasida timestamptz qiymatlarini UTC qiymatlari sifatida saqlaydi.

© postgresqltutorial.com

Last updated

Was this helpful?