Bu gün yenə də zaman məlumatları ilə manipulyasiyaya baş vuracağıq, onlardan konkret hissələri (məsələn, il, ay və ya həftənin günü) necə çıxarmağı EXTRACT() funksiyası ilə öyrənəcəyik və AGE() funksiyası ilə yaş və ya tarixlər arasındakı intervalları necə hesablamaq olar, baxacağıq.
Real layihələrdə zaman məlumatları ilə işləyərkən tez-tez tarix və ya zamanın konkret hissəsini çıxarmaq lazım olur. Məsələn:
- Sifarişləri illərə və ya aylara bölmək;
- Müəyyən həftə günü qeydiyyatdan keçən istifadəçilərin sayını hesablamaq;
- İki hadisə arasındakı müddətin analizini aparmaq.
Belə tapşırıqları həll etmək üçün EXTRACT() və AGE() funksiyalarından istifadə edirik.
EXTRACT() nədir?
EXTRACT() funksiyası tarix və ya zaman damğasından konkret hissəni çıxarmağa imkan verir. Məsələn, doğum tarixindən ili çıxarmaq, ay nömrəsini tapmaq və ya həftənin gününü çıxarmaq olar.
Sintaksis:
EXTRACT(part FROM source)
part: çıxarmaq istədiyin tarix hissəsi. BuYEAR,MONTH,DAY,HOUR,MINUTE,SECONDvə s. ola bilər.source: məlumat çıxarılan zaman tipi. Bu sütun, sabit və ya funksiyanın nəticəsi ola bilər.
Nümunə 1: il, ay və günün çıxarılması
SELECT
EXTRACT(YEAR FROM '2024-11-15'::DATE) AS year_part,
EXTRACT(MONTH FROM '2024-11-15'::DATE) AS month_part,
EXTRACT(DAY FROM '2024-11-15'::DATE) AS day_part;
Nəticə:
| year_part | month_part | day_part |
|---|---|---|
| 2024 | 11 | 15 |
Burda biz 2024-11-15 tarixindən il, ay və günü çıxardıq. Bu yanaşma, məlumatları tarix hissələrinə görə qruplaşdırmaq lazım olanda faydalıdır.
Nümunə 2: həftənin günü və saatın çıxarılması
SELECT
EXTRACT(DOW FROM '2024-11-15'::DATE) AS day_of_week,
EXTRACT(HOUR FROM '15:30:00'::TIME) AS hour_part;
Nəticə:
| day_of_week | hour_part |
|---|---|
| 3 | 15 |
DOW(Day of Week) həftənin gününün nömrəsini qaytarır: bazar —0, bazar ertəsi —1və s.HOURzaman dəyərindən saatı çıxarır.
Nümunə 3: sütunlara tətbiq
Əgər tarixləri olan cədvəlimiz varsa, analiz üçün tarix hissələrini çıxara bilərik. Tutaq ki, orders cədvəlimiz var:
| order_id | order_date |
|---|---|
| 1 | 2023-05-12 14:20 |
| 2 | 2023-06-18 10:45 |
| 3 | 2023-07-22 21:15 |
SELECT
order_id,
EXTRACT(MONTH FROM order_date) AS month,
EXTRACT(DAY FROM order_date) AS day
FROM orders;
Nəticə:
| order_id | month | day |
|---|---|---|
| 1 | 5 | 12 |
| 2 | 6 | 18 |
| 3 | 7 | 22 |
AGE() nədir?
AGE() funksiyası iki zaman damğası arasındakı fərqi hesablamaq üçün istifadə olunur. Məsələn, müştərinin doğum tarixindən yaşını hesablamaq və ya sifarişin verilməsindən nə qədər vaxt keçdiyini tapmaq olar.
Sintaksis:
AGE(timestamp1, timestamp2)
timestamp1: Daha gec olan zaman damğası.timestamp2: Daha əvvəlki zaman damğası.- Əgər yalnız bir parametr versən, PostgreSQL onu avtomatik olaraq cari tarix (
NOW()) ilə müqayisə edəcək.
Nümunə 1: yaşın hesablanması
SELECT AGE('2025-11-15'::DATE, '1990-05-12'::DATE) AS age;
Nəticə:
| age |
|---|
| 35 years 6 mons |
Bu nümunədə 12 may 1990-cı ildə doğulan insanın 15 noyabr 2025-ci il tarixinə olan yaşını göstərir.
Nümunə 2: hadisələr arasındakı interval
SELECT AGE('2023-06-01 15:00'::TIMESTAMP, '2023-05-20 10:30'::TIMESTAMP) AS duration;
Nəticə:
| duration |
|---|
| 11 days 4:30:00 |
Burda iki hadisə arasındakı zaman intervalını hesablamaq üçün istifadə etdik. Tapşırığın başlanğıcı və sonu arasındakı müddəti hesablamaq üçün faydalıdır.
Nümunə 3: müştərinin yaşı
Tutaq ki, customers cədvəlimiz var:
| customer_id | birth_date |
|---|---|
| 1 | 1992-03-10 |
| 2 | 1985-07-07 |
Müştərilərin yaşını hesablaya bilərik:
SELECT
customer_id,
AGE(NOW(), birth_date) AS age
FROM customers;
2025-ci il 13 iyun üçün nəticə:
| customer_id | age |
|---|---|
| 1 | 33 years 3 mons |
| 2 | 39 years 11 mons |
Təbii ki, səndə NOW() fərqli olacaq və nəticə də başqa çıxacaq.
EXTRACT() və AGE() istifadə üçün praktiki nümunələr
İndi bu funksiyaları real ssenarilərdə birləşdiririk.
Nümunə 1: məlumatların aylara görə qruplaşdırılması
Tutaq ki, tarixləri olan sifariş cədvəlimiz var. Sifarişləri aylara görə saymaq üçün belə yazırıq:
SELECT
EXTRACT(MONTH FROM order_date) AS order_month,
COUNT(*) AS total_orders
FROM orders
GROUP BY order_month
ORDER BY order_month;
Nümunə 2: müddətin bitməsinə qalan günlər
Təsəvvür elə ki, subscriptions cədvəlimiz var:
| subscription_id | expiry_date |
|---|---|
| 1 | 2023-12-31 |
| 2 | 2024-05-15 |
İstəyirik bilək ki, abunəliyin bitməsinə neçə gün qalıb:
SELECT
subscription_id,
AGE(expiry_date, NOW()) AS time_remaining
FROM subscriptions;
Nəticə:
| subscription_id | time_remaining |
|---|---|
| 1 | 1 mons 15 days |
| 2 | 6 mons |
Tipik səhvlər və onlardan necə qaçmaq olar
EXTRACT() və AGE() istifadə edəndə yeni başlayanlar bəzən belə problemlərlə rastlaşır:
- Məsələn,
TIMEtipindən ay çıxarmağa çalışmaq. Yadda saxla:YEAR,MONTHvəDAYhissələriDATE,TIMESTAMPilə işləyir, ammaTIMEilə yox. - Zaman məlumatlarının fərqli formatları ilə problemlər. Məsələn,
2023/11/15sətiri tarix sayılmır.::DATEvə yaTO_DATE()ilə tip çevirmə istifadə et. AGE()və zaman damğalarının çıxılması arasındakı fərq. Əgər dəqiq interval (ay, gün, saniyə ilə) lazımdırsa —AGE()istifadə et, sadəcə günlərin sayı lazımdırsa, arifmetik əməliyyatlar kifayətdir.
İndi artıq PostgreSQL-də zaman məlumatlarının hissələrini çıxarmaq və analiz etmək üçün lazım olan bütün bacarıqlara maliksən. EXTRACT() və AGE() ilə öz layihələrində rahatca işləyə bilərsən!
GO TO FULL VERSION