Treninq bir yarım saat davam edir, iş günü — 8 saat, fasilə — 20 dəqiqə, yumurta qaynatmaq üçün isə 10 dəqiqə lazımdır. Bütün bunlar — zaman intervalı haqqındadır.
Zaman intervalları real tətbiqlərdə faydalıdır, məsələn, tapşırıqların yerinə yetirilmə müddətini hesablamaq, iki tarix arasındakı fərqi tapmaq və ya vaxt əlavə/çıxmaq lazım olanda. Amma detallara keçməzdən əvvəl, əvvəlki dərslərdə harada qaldığımızı qısa xatırlayaq.
PostgreSQL-də INTERVAL — bu xüsusi data tipidir və zaman aralığını göstərmək üçün nəzərdə tutulub. Digər zaman tiplərindən fərqli olaraq, o konkret tarix və ya vaxt saxlamır, sadəcə bir dövrü təsvir edir, məsələn: "2 gün", "3 saat", "5 dəqiqə".
INTERVAL üçün sintaksis
Intervalı bu formatda yaza bilərsən:
INTERVAL 'ədəd zaman_vahidi'
Nümunələr:
INTERVAL '2 days' -- İki gün
INTERVAL '3 hours' -- Üç saat
INTERVAL '15 minutes' -- On beş dəqiqə
INTERVAL '1 day 2 hours' -- Bir gün və iki saat
PostgreSQL müxtəlif zaman vahidlərini dəstəkləyir: year, month, day, hour, minute, second. Bunları bir ifadədə birləşdirə bilərsən.
Sorgularda intervaldan istifadə
INTERVAL data tipi xüsusilə digər zaman tipləri (DATE, TIMESTAMP) ilə birlikdə istifadə edəndə çox faydalı olur. Gəlin əsas əməliyyatlara baxaq.
Tarixə/vaxta interval əlavə etmək
Intervalı tarix və ya vaxt dəyərlərinə əlavə edə bilərsən. Məsələn:
SELECT CURRENT_DATE + INTERVAL '7 days' AS delivery_date;
-- Cari tarixdən 7 gün sonra olan tarixi alırıq
Nəticə:
| delivery_date |
|---|
| 2023-10-08 |
Tarixdən/vaxtdan interval çıxmaq
Əlavə etməklə yanaşı, intervalı çıxmaq da olar:
SELECT NOW() - INTERVAL '2 hours' AS two_hours_ago;
-- İki saat əvvəl olan vaxtı alırıq
Nəticə:
| two_hours_ago |
|---|
| 2023-10-01 10:00:00.000 |
İki tarix arasındakı fərqi hesablamaq
INTERVAL-ın güclü funksiyalarından biri də iki tarix arasındakı fərqi hesablamaqdır:
SELECT '2023-10-15'::DATE - '2023-10-01'::DATE AS days_difference;
-- İki tarix arasındakı gün sayı
Nəticə:
| days_difference |
|---|
| 14 days |
Qeyd et ki, nəticə də burada zaman intervalı kimi göstərilir.
INTERVAL ilə işləməyə dair praktiki nümunələr
Çatdırılma tarixinin hesablanması. Təsəvvür et ki, internet mağazası var və çatdırılma 3-dən 7 günə qədər çəkir. Mümkün çatdırılma tarixlərini belə hesablaya bilərsən:
SELECT CURRENT_DATE + INTERVAL '3 days' AS earliest_delivery,
CURRENT_DATE + INTERVAL '7 days' AS latest_delivery;
Nəticə:
| earliest_delivery | latest_delivery |
|---|---|
| 2023-10-04 | 2023-10-08 |
Tapşırığın yerinə yetirilmə vaxtının hesablanması. Tutaq ki, tasks adlı cədvəlin var və hər tapşırığın başlanğıc tarixi qeyd olunub. Tapşırığın davametmə müddətini saatla nəzərə alaraq bitmə tarixini hesablamaq lazımdır:
CREATE TABLE tasks (
task_id SERIAL PRIMARY KEY,
task_name TEXT,
start_time TIMESTAMP,
duration INTERVAL
);
INSERT INTO tasks (task_name, start_time, duration)
VALUES
('Hesabat hazırla', '2023-10-01 09:00:00', INTERVAL '4 hours'),
('Tətbiqi yoxla', '2023-10-01 10:00:00', INTERVAL '2 hours 30 minutes');
SELECT task_name,
start_time,
start_time + duration AS end_time
FROM tasks;
Nəticə:
| task_name | start_time | end_time |
|---|---|---|
| Hesabat hazırla | 2023-10-01 09:00:00 | 2023-10-01 13:00:00 |
| Tətbiqi yoxla | 2023-10-01 10:00:00 | 2023-10-01 12:30:00 |
Yerinə yetirilmə müddətinin müqayisəsi. Bəzən bizə 3 saatdan az vaxtda yerinə yetirilən bütün tapşırıqları tapmaq lazımdır:
SELECT task_name
FROM tasks
WHERE duration < INTERVAL '3 hours';
Nəticə:
| task_name |
|---|
| Tətbiqi yoxla |
Interval ilə bağlı faydalı trüklər
Intervalın dinamik hesablanması. Intervalı digər əməliyyatlarla birləşdirmək olar. Məsələn, sütundan gün sayını götürüb intervala çevirmək:
SELECT CURRENT_DATE + (order_days || ' days')::INTERVAL AS order_due_date
FROM orders;
Intervalı string-ə çevirmək. Bəzən intervalı göstərmək üçün onu string-ə çevirmək lazım olur:
SELECT INTERVAL '2 days 3 hours'::TEXT AS interval_text;
Nəticə:
| interval_text |
|---|
| 2 days 03:00:00 |
INTERVAL ilə işləyərkən yayılmış səhvlər
INTERVAL ilə işləmək güclü olsa da, bəzən çətinlik yarada bilər. Tipik səhvlərdən biri — səhv formatdan istifadə etməkdir. Məsələn, INTERVAL '2 hours and 30 minutes' yazsan, səhv alacaqsan, çünki PostgreSQL "and" sözünü başa düşmür. Düzgün yazılış: INTERVAL '2 hours 30 minutes'.
Başqa bir səhv — zaman vahidini göstərməməklə bağlıdır, məsələn INTERVAL '2'. PostgreSQL "2"nin nə olduğunu anlamır, ona görə həmişə vahidi dəqiq göstər: (2 days, 2 hours).
GO TO FULL VERSION