CodeGym /Kurslar /SQL SELF /Tarix və vaxtın formatlaşdırılması: NOW(), CURRENT_DATE...

Tarix və vaxtın formatlaşdırılması: NOW(), CURRENT_DATE, DATE_PART()

SQL SELF
Səviyyə, Dərs
Mövcuddur

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.

Sintaksis:
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.

2
Tapşırıq
SQL SELF, səviyyə, dərs
Bağlanıb
Cari tarixdən il və ayın çıxarılması
Cari tarixdən il və ayın çıxarılması
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION