Tarix və vaxt — sadəcə abstrakt rəqəmlər deyil, məlumatların ən dəyərli hissəsinə açardır. Real həyatda tez-tez tarixlərlə rastlaşırsan: məsələn, satışların aylara görə analizi, işçilərin doğum tarixinə görə filtrasiya və ya vaxt intervallarının müqayisəsi. Tarixlərlə necə işləməyi bilmək daha çevik sorğular qurmağa və mürəkkəb analitik nəticələr çıxarmağa imkan verir.
Tarixlərlə işləməyin kritik olduğu nümunələr:
- Müəyyən bir ay üçün satışların analizi.
- Son bir ildə qeydiyyatdan keçən istifadəçilərin sayının hesablanması.
- Zaman intervallarına görə hesabatların qurulması (məsələn, aylıq gəlirlər).
PostgreSQL-də tarixlərlə işləmək üçün bir çox funksiya var, indi isə ən faydalı olanlarına baxacağıq.
Tarix və vaxt ilə işləmək üçün əsas funksiyalar
NOW() funksiyası serverin cari tarix və vaxtını qaytarır. Bu, sənə dəqiq cari vaxtı bilmək lazım olanda istifadə olunur. Məsələn, yeni bir qeyd yaradanda onun yaradılma vaxtını yazmaq istəyirsən.
SELECT NOW();
Nümunə nəticə:
2023-11-05 15:23:45.123456+00
İstifadə nümunəsi: Sən cari tarix və vaxt ilə sifariş haqqında qeyd əlavə etmək istəyirsən:
INSERT INTO orders (order_id, order_date, total_amount)
VALUES (1, NOW(), 150.00);
Şərh: burada
NOW() avtomatik olaraq cari tarix və vaxtı
order_date sütununa əlavə edəcək.
INSERT operatorunun necə işlədiyini növbəti dərslərdə öyrənəcəksən :P
CURRENT_DATE funksiyası
Əgər sənə sadəcə cari tarix lazımdırsa və vaxt önəmli deyilsə, CURRENT_DATE istifadə et. O, yalnız il, ay və günü qaytarır.
Sintaksis:
SELECT CURRENT_DATE;
Nümunə nəticə:
2023-11-05
İstifadə nümunəsi: Tutaq ki, sən bu gün üçün qeydləri almaq istəyirsən:
SELECT *
FROM orders
WHERE order_date = CURRENT_DATE;
Şərh: burada biz
order_date sütunundakı tarixi cari tarixlə müqayisə edirik.
Bir az zarafat əlavə edək. NOW() — işdəki kofe kimidir: indi və buradadır. CURRENT_DATE isə divardakı təqvim kimidir: sadəcə tarix, əlavə detallar olmadan.
DATE_PART() ilə tarix hissələrinin çıxarılması
DATE_PART() funksiyası bizə tarixdən müəyyən bir hissəni almağa imkan verir, məsələn il, ay, gün, saat və ya dəqiqə. Bu, məsələn, müəyyən bir il üçün sifarişlərin sayını hesablamaq və ya həftənin gününü tapmaq üçün rahatdır.
Sintaksis:
DATE_PART('hisse', tarix)
Nümunə:
SELECT DATE_PART('year', NOW()) AS current_year;
Nümunə nəticə:
| current_year |
|---|
| 2025 |
Tarixdən çıxara biləcəyin hissələr:
year: il.month: ay.day: gün.hour: saat.minute: dəqiqə.second: saniyə.dow: həftənin günü (0 = bazar).
Nümunə 2: Cari tarixdən ay çıxaraq.
SELECT DATE_PART('month', CURRENT_DATE) AS current_month;
Nəticə:
| current_month |
|---|
| 6 |
DATE_PART() funksiyasını mürəkkəb hesablama üçün də istifadə edə bilərsən. Məsələn:
Sən yalnız cari ildə doğulan istifadəçiləri seçmək istəyirsən:
SELECT *
FROM students
WHERE DATE_PART('year', birth_date) = DATE_PART('year', CURRENT_DATE);
Nümunə nəticə:
| id | first_name | last_name | birth_date | grade |
|---|---|---|---|---|
| 1 | Otto | Art | 2025-03-12 | 9 |
| 2 | Anna | Pal | 2025-07-08 | 8 |
| 3 | Piu | Wolf | 2025-01-22 | 10 |
| 4 | Eva | Go | 2025-09-30 | 7 |
| 5 | Dan | Sok | 2025-06-14 | 9 |
Praktik nümunələr
Bəzi nümunələrdə hələ öyrənmədiyin operatorlar olacaq. Narahat olma, tezliklə belə nümunələri asanlıqla həll edəcəksən. Sadəcə istəyirəm ki, sənə daha çox real həyat nümunəsi göstərim. Bir az da maraq oyadım :)
Nümunə 1: İstifadəçinin yaşını hesablamaq
Tutaq ki, bizdə hər istifadəçinin doğum tarixi olan users cədvəli var. Onların yaşını hesablamaq istəyirik.
Sorğu:
SELECT user_id, first_name, last_name,
DATE_PART('year', CURRENT_DATE) - DATE_PART('year', birth_date) AS age
FROM users;
Sadəcə cari ilin ilini doğum ilindən çıxırıq. Bu, sürətli, amma tam dəqiq olmayan üsuldur.
Nümunə nəticə:
| user_id | first_name | last_name | age |
|---|---|---|---|
| 101 | Alex | Lin | 25 |
| 102 | Maria | Chi | 30 |
| 103 | Tor | Coz | 22 |
| 104 | Nat | Ive | 27 |
| 105 | Don | Sok | 35 |
Nümunə 2: Vaxta görə filtrasiya
Əgər sən son bir saatda verilən bütün sifarişləri seçmək istəyirsənsə:
SELECT *
FROM orders
WHERE order_date >= NOW() - INTERVAL '1 hour';
Görürsən, INTERVAL (vaxt intervalı təyini) necə rahatdır.
Nümunə 3: Aylara görə qruplaşdırma
Sən cari ilin hər ayı üçün sifarişlərin sayını hesablamaq istəyirsən:
SELECT DATE_PART('month', order_date) AS order_month, COUNT(*) AS order_count
FROM orders
WHERE DATE_PART('year', order_date) = DATE_PART('year', CURRENT_DATE)
GROUP BY DATE_PART('month', order_date)
ORDER BY order_month;
Qruplaşdırma ay nömrəsinə görə aparılır və nəticə də ona görə sıralanır.
Nümunə nəticə:
| order_month | order_count |
|---|---|
| 1 | 120 |
| 2 | 95 |
| 3 | 134 |
| 4 | 110 |
| 5 | 42 |
Nümunə 4: Həftənin gününü çıxarmaq
Sən bilmək istəyirsən ki, ən çox sifariş hansı həftə günü verilib:
SELECT DATE_PART('dow', order_date) AS day_of_week, COUNT(*) AS order_count
FROM orders
GROUP BY DATE_PART('dow', order_date)
ORDER BY order_count DESC;
DATE_PART('dow') komandası hər sifariş üçün həftənin gününü rəqəm kimi qaytaracaq: 0 — bazar, 1 — bazar ertəsi və s. DOW - DayOfWeek-in qısaltmasıdır - həftənin günü.
Nümunə nəticə:
| day_of_week | order_count |
|---|---|
| 5 | 210 |
| 4 | 190 |
| 3 | 175 |
| 2 | 160 |
| 1 | 140 |
| 6 | 120 |
| 0 | 95 |
Tipik səhvlərə diqqət et
Tarixlərlə işləmək tez-tez baş ağrısı yaradır, çünki səhvlər olur. Budur, rastlaşa biləcəyin bir neçə yayılmış problem:
Vaxt və tarix formatı: NOW() və ya tarix və vaxt qaytaran istənilən funksiyanı istifadə edəndə, onun formatını yoxla. Məsələn, order_date ilə CURRENT_DATE müqayisə edəndə əmin ol ki, vaxt nəzərə alınmır və ya açıq şəkildə göstərilib.
Tarix string formatında: Tez-tez bazalarda tarixlər string (məsələn, mətn) kimi saxlanılır. Əgər tarixlərlə işləmək üçün funksiyalardan (məsələn, DATE_PART()) istifadə etsən, səhv alacaqsan. Əmin ol ki, məlumatın tipi DATE və ya TIMESTAMP-dır.
Fərqli zaman zonaları: Əgər server bir zaman zonasında işləyir, amma məlumat başqa zonadan toplanırsa, qarışıqlıq ola bilər. TIMESTAMPTZ zaman zonasından istifadə etməyi düşün.
GO TO FULL VERSION