CodeGym /Kurslar /SQL SELF /Zaman məlumatlarının yuvarlaqlaşdırılması və kəsilməsi: ...

Zaman məlumatlarının yuvarlaqlaşdırılması və kəsilməsi: DATE_TRUNC()

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

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:45 tarixini 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, TIMESTAMP tipli bir sütun və ya başqa bir funksiyanın nəticəsi ola bilər, məsələn NOW().

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()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ə.

Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION