PostgreSQL-də cari zaman dəyərləri ilə işləmək üçün bir neçə daxili funksiya var. Bu funksiyalar, məsələn, qeyd yaradılma vaxtını avtomatik izləmək, cari tarixə əsaslanan hesabatlar qurmaq və ya hadisənin müəyyən dövrdə baş verib-vermədiyini yoxlamaq kimi işlərdə faydalıdır. Gəlin əsas üç funksiyaya baxaq: NOW(), CURRENT_DATE və CURRENT_TIME.
NOW(): cari tarix və vaxtı almaq
NOW() funksiyası cari tarix və vaxtı TIMESTAMP WITH TIME ZONE formatında qaytarır. Yəni, nəticə serverin saat qurşağını da nəzərə alır.
Nümunə:
SELECT NOW();
-- Nəticə: 2025-05-25 14:30:45.761523+03
Diqqət elə ki, nəticədə bunlar var:
- tarix (
2025-05-25), - vaxt (
14:30:45.761523), - saat qurşağı (
+03).
Əgər sənə saat qurşağı lazım deyilsə, nəticəni TIMESTAMP-a çevirə bilərsən:
SELECT NOW()::TIMESTAMP;
-- Nəticə: 2025-05-25 14:30:45.761523
CURRENT_DATE: cari tarixi almaq
CURRENT_DATE funksiyası yalnız cari tarixi qaytarır, vaxt olmadan. Qaytardığı tip — DATE.
Nümunə:
SELECT CURRENT_DATE;
-- Nəticə: 2025-05-25
Bu, vaxtı nəzərə almaq lazım olmayan hallarda, məsələn, yaş hesablamalarında və ya məlumatları günlərə görə qruplaşdıranda rahatdır.
CURRENT_TIME: cari vaxtı almaq
CURRENT_TIME funksiyası cari vaxtı TIME WITH TIME ZONE formatında qaytarır. Əgər saat qurşağı lazım deyilsə, nəticəni TIME-a çevirə bilərsən.
Nümunə:
SELECT CURRENT_TIME;
-- Nəticə: 14:30:45.761523+03
SELECT CURRENT_TIME::TIME;
-- Nəticə: 14:30:45.761523
Funksiyaların istifadə nümunələri
Gəlin bu funksiyaların faydalı ola biləcəyi bir neçə praktik nümunəyə baxaq.
Qeyd yaradılma vaxtının avtomatik doldurulması
Cədvələ qeyd əlavə edəndə, çox vaxt onların yaradılma tarix və vaxtını avtomatik saxlamaq yaxşı olur. PostgreSQL-də bunu cədvəl yaradanda DEFAULT NOW() göstərməklə edə bilərsən.
Cədvəl yaratmaq nümunəsi:
CREATE TABLE orders (
id SERIAL PRIMARY KEY,
customer_name TEXT NOT NULL,
created_at TIMESTAMP DEFAULT NOW() -- sətrin yaradılma anı
);
Qeyd əlavə etmək:
INSERT INTO orders (customer_name) VALUES ('Otto Lin');
Cədvəlin tərkibinə baxaq:
SELECT * FROM orders;
Nəticə:
| id | customer_name | created_at |
|---|---|---|
| 1 | Otto Lin | 2024-11-25 14:45:12.154678 |
Məlumatların tarixə görə filtrasiyası
Tutaq ki, bizdə sifarişlər cədvəli var və bu gün yaradılmış bütün sifarişləri seçmək istəyirik. Filtr üçün CURRENT_DATE funksiyasından istifadə edirik:
SELECT *
FROM orders
WHERE created_at::DATE = CURRENT_DATE;
Burada created_at::DATE çevirməsindən istifadə edirik ki, vaxtı ataq və yalnız tarixi saxlayaq.
NOW() və CURRENT_TIMESTAMP arasındakı fərqlər
İlk baxışdan elə gəlir ki, NOW() və CURRENT_TIMESTAMP eyni işi görür. Əslində, belədir. Sadəcə NOW() bir standartdan, CURRENT_TIMESTAMP isə başqa standartdan gəlib.
NOW() — PostgreSQL funksiyası
NOW() funksiyası PostgreSQL-in daxili funksiyasıdır və TIMESTAMP WITH TIME ZONE (timestamptz) tipində dəyər qaytarır. Bu, SQL sorğusunun icrasına başlananda serverin cari vaxtıdır.
Nümunə:
SELECT NOW();
CURRENT_TIMESTAMP — SQL standartı
CURRENT_TIMESTAMP — SQL standartı ilə müəyyən olunmuş ifadədir və PostgreSQL-də də TIMESTAMP WITH TIME ZONE qaytarır. Əslində, PostgreSQL CURRENT_TIMESTAMP-i NOW() ilə eyni funksiyaya yönləndirir.
Nümunə:
SELECT CURRENT_TIMESTAMP;
Praktik müqayisə
SELECT NOW(), CURRENT_TIMESTAMP;
Nəticə:
| now | current_timestamp |
|---|---|
| 2025-05-25 14:30:45+03 | 2025-05-25 14:30:45+03 |
Hər iki dəyər eynidir, çünki sorğunun əvvəlində hesablanır.
Zaman funksiyalarının filtr şərtlərində istifadəsi
İndi isə son 7 gündə yaradılmış qeydləri seçən sorğu yazaq. Bunun üçün NOW()-dan və tarix üzərində arifmetikadan istifadə edə bilərik:
SELECT *
FROM orders
WHERE created_at >= NOW() - INTERVAL '7 days';
Eyni qaydada, cari ay üçün sifarişləri seçmək istəsək, DATE_TRUNC() funksiyasından istifadə edə bilərik ki, ayın əvvəlini və sonunu tapmaq olsun:
SELECT *
FROM orders
WHERE created_at >= DATE_TRUNC('month', NOW());
DATE_TRUNC() maraqlı funksiyadır, bu barədə bir neçə dərsdən sonra daha ətraflı danışacam :P
Praktik məsləhətlər
- Əgər sənə saat qurşağı ilə dəqiq vaxt lazımdırsa,
NOW()və yaCURRENT_TIMESTAMPistifadə et. - Sadəcə tarix kifayət edirsə (məsələn, yaş hesablaması və ya müəyyən gün üçün analiz),
CURRENT_DATEistifadə et. CURRENT_TIMEadətən hesabatlarda və ya interfeyslərdə, tapşırığa nə qədər vaxt getdiyini göstərmək üçün istifadə olunur.
Növbəti dərsdə EXTRACT() və AGE() funksiyalarından istifadə edərək tarix və vaxt hissələrini necə çıxarmağı öyrənəcəyik. Onlarla, məsələn, insanın yaşını asanlıqla hesablamaq və ya məlumatları günlər, aylar və illər üzrə işləmək olar.
GO TO FULL VERSION