DATE_TRUNC() — bu, sənə zaman dəyərlərini müəyyən bir zaman vahidinə qədər "kəsməyə" imkan verən güclü bir alətdir. Məsələn, bununla zaman möhürünü günün, ayın, ilin, saatın və s. əvvəlinə qədər yuvarlaqlaşdıra bilərsən. Bu xüsusilə periodlar üzrə analiz üçün faydalıdır (məsələn, sifarişləri günə, aya və ya ilə görə qruplaşdırmaq lazım olanda).
Təsəvvür elə ki, tarix və zaman uzun bir mətn sətiridir, burada saat, dəqiqə, saniyə var. DATE_TRUNC() funksiyası bu sətiri götürüb "artıqları kəsir", sənə lazım olan hissəni saxlayır. Məsələn:
- Sən
2023-10-01 15:30:45tarixini günün əvvəlinə qədər kəsmək istəyirsən. Nəticə olacaq:2023-10-01 00:00:00. - Yaxud sadəcə saatın ilk saniyəsini saxlamaq istəyirsən, yəni
2023-10-01 15:00:00.
Sintaksis
DATE_TRUNC() funksiyasının sintaksisi belədir:
DATE_TRUNC(field, source)
- field — bu, tarixi hansı zaman vahidinə qədər "kəsmək" istədiyini göstərir. Məsələn,
year,month,day,hour,minute. - source — bu, kəsmək istədiyin zaman dəyəridir. Bu,
TIMESTAMPtipli bir sütun və ya başqa bir funksiyanın nəticəsi ola bilər, məsələnNOW().
Sadə çağırış nümunəsi:
SELECT DATE_TRUNC('day', TIMESTAMP '2023-10-01 15:30:45');
-- Nəticə: 2023-10-01 00:00:00
Dəstəklənən sahələr
Burada DATE_TRUNC()-da istifadə edə biləcəyin bəzi zaman vahidlərinin siyahısı var:
| Zaman vahidi | Təsviri |
|---|---|
year |
İlin əvvəli (məsələn, 2023-01-01 00:00:00) |
quarter |
Rübün əvvəli (məsələn, 2023-07-01 00:00:00) |
month |
Ayın əvvəli (məsələn, 2023-10-01 00:00:00) |
week |
Həftənin əvvəli* (məsələn, 2023-09-25 00:00:00) |
day |
Günün əvvəli (məsələn, 2023-10-01 00:00:00) |
hour |
Saatın əvvəli (məsələn, 2023-10-01 15:00:00) |
minute |
Dəqiqənin əvvəli (məsələn, 2023-10-01 15:30:00) |
second |
Saniyənin əvvəli (məsələn, 2023-10-01 15:30:45) |
Zaman vahidi nə qədər kiçik olsa, kəsmə nəticəsi bir o qədər dəqiq olur. Yeri gəlmişkən, həftə bazar günü başlayır :)
DATE_TRUNC() istifadəsinə nümunələr
Günün əvvəlinə qədər kəsmək. Bu nümunədə zaman möhürünü götürüb günün əvvəlinə qədər yuvarlaqlaşdıracağıq:
SELECT DATE_TRUNC('day', TIMESTAMP '2023-10-01 15:30:45') AS truncated_day;
-- Nəticə: 2023-10-01 00:00:00
Ayın əvvəlinə qədər kəsmək. İndi tarixi ayın əvvəlinə qədər kəsirik:
SELECT DATE_TRUNC('month', TIMESTAMP '2023-10-01 15:30:45') AS truncated_month;
-- Nəticə: 2023-10-01 00:00:00
İlin əvvəlinə qədər kəsmək. Tarixi ilin əvvəlinə qədər yuvarlaqlaşdırmağa çalışaq:
SELECT DATE_TRUNC('year', TIMESTAMP '2023-10-01 15:30:45') AS truncated_year;
-- Nəticə: 2023-01-01 00:00:00
Cari zamanla istifadə (NOW()). Əgər həmişə cari tarix və zamanla işləmək istəyirsənsə, DATE_TRUNC() və NOW()-u birləşdirə bilərsən:
SELECT DATE_TRUNC('hour', NOW()) AS truncated_hour;
-- Nəticə cari zamandan asılı olacaq, məsələn: 2023-10-01 15:00:00
Sifarişləri aylara görə qruplaşdırmaq. İndi isə daha praktik bir nümunəyə keçək. Tutaq ki, bizdə sifarişlər olan bir cədvəl var və hər bir yazıda sifariş tarixi göstərilib. Hər ay üçün sifarişlərin sayını hesablamaq istəyirik:
CREATE TABLE orders (
order_id SERIAL PRIMARY KEY,
order_date TIMESTAMP NOT NULL
);
INSERT INTO orders (order_date) VALUES
('2023-10-01 10:15:00'),
('2023-10-01 15:30:00'),
('2023-09-15 12:45:00'),
('2023-08-20 09:00:00'),
('2023-08-25 10:30:00');
SELECT DATE_TRUNC('month', order_date) AS order_month,
COUNT(*) AS total_orders
FROM orders
GROUP BY order_month
ORDER BY order_month;
Nəticə:
| order_month | total_orders |
|---|---|
| 2023-08-01 00:00 | 2 |
| 2023-09-01 00:00 | 1 |
| 2023-10-01 00:00 | 2 |
İstifadə üçün praktik hallar
Zaman məlumatlarının periodlara görə analizi: hər il, ay və ya gün neçə istifadəçi qeydiyyatdan keçib bilmək istəyirsən? Qruplaşdırma üçün DATE_TRUNC()-dan istifadə et.
Hesabatların qurulması: zaman möhürünü düzgün yuvarlaqlaşdırmaq hesabatları oxunaqlı edir.
Tarix və zamanın müqayisəsi: əgər yüksək dəqiqlikli zaman məlumatların varsa (məsələn, millisekundlarla), onları düzgün səviyyəyə qədər kəs ki, müqayisə düzgün alınsın.
DATE_TRUNC() istifadə zamanı tipik səhvlər
Dəstəklənməyən sahələrdən istifadə. Məsələn, millisecond sahəsi dəstəklənmir və onu istifadə etməyə çalışsan, səhv çıxacaq.
Yanlış data tipi. DATE_TRUNC() yalnız zaman tipli datalarla işləyir, məsələn TIMESTAMP. Əgər ona string ötürsən, səhv alacaqsan.
Yuvarlaqlaşdırma səhvi. Yadda saxla ki, DATE_TRUNC() həmişə zamanı göstərilən zaman vahidinin əvvəlinə qədər kəsir. Əgər zamanı yuvarlaqlaşdırmaq istəyirsənsə, başqa yanaşmalardan istifadə elə.
GO TO FULL VERSION