Bu gün də yenə səhvlərdən danışacağıq. Çünki tarix və vaxtla işləmək minaya basmaq kimidir: hər şey yaxşıdır, ta ki, ilk səhv addımı atana qədər.
Data tipini seçərkən səhvlər
Bütün problemlərin kökü çox vaxt buradan başlayır. Yanlış data tipi seçmək tarix və vaxtla bağlı bütün zəhmətinizi puç edə bilər.
Vəziyyət 1: DATE əvəzinə TIMESTAMP istifadə etmək
Əgər hadisəni qeydə alırsan və orada təkcə tarix yox, həm də vaxt vacibdirsə, təkcə DATE istifadə etmək vacib informasiyanı itirməyinə səbəb ola bilər.
CREATE TABLE orders (
order_id SERIAL PRIMARY KEY,
order_date DATE -- yalnız tarix
);
Belə dizaynda sən bilə bilməyəcəksən ki, iki sifariş səhər verilib, yoxsa axşam. Axı niyə kofe içib gözəl timestamp-lara baxmaq imkanını itirəsən ki?
Vəziyyət 2: Zaman zonalarını unutmaq
Əgər tətbiqin beynəlxalq istifadəçilərlə işləyirsə, amma sən tarix və vaxtı sadəcə TIMESTAMP ilə saxlayırsan, zaman zonalarını nəzərə almırsan, dataların "evsiz" qalacaq. TIMESTAMPTZ bu problemi sənin yerinə həll edir.
CREATE TABLE events (
event_time TIMESTAMP -- zaman zonası olmadan
);
Heç kim Nyu-Yorkda axşam tədbirini Tokioda səhər tədbiri ilə qarışdırmaq istəmir. TIMESTAMPTZ istifadə elə!
Funksiyalardan istifadə zamanı səhvlər
Vəziyyət 1: TO_CHAR() içində yanlış format
Əgər formatı səhv göstərsən, problemlər başlayır. Məsələn:
SELECT TO_CHAR(NOW(), 'YYYY-DD-MM'); -- Ayı və günü səhv saldım
Burada adət etdiyimiz il-ay-gün əvəzinə il-gün-ay alındı. Bu, istifadəçilərin üçün bəzən gülməli (amma həmişə xoş olmayan) situasiyalara gətirib çıxara bilər. Həmişə formatı yoxla.
Vəziyyət 2: TO_DATE() istifadə zamanı səhvlər
Əksinə, əgər string-i tarixə çevirmək istəyirsən, amma format uyğun gəlmir, PostgreSQL səhv verəcək.
SELECT TO_DATE('10/31/2023', 'YYYY-MM-DD'); -- Səhv! Format uyğun gəlmir.
String-in formatı tam olaraq göstərdiyin formata uyğun olmalıdır. Məsələn:
SELECT TO_DATE('2023-10-31', 'YYYY-MM-DD'); -- Hər şey qaydasındadır.
Zaman intervalları ilə bağlı səhvlər
Vəziyyət 1: İmplicit tip çevrilməsi
Bəzən tip çevrilməsinin özəlliklərini unuda bilərsən. Məsələn:
SELECT NOW() + '1'; -- SƏHV! '1' nədir, aydın deyil.
PostgreSQL başa düşmür ki, sən bir gün əlavə etmək istəyirsən. Düzgün yol:
SELECT NOW() + INTERVAL '1 day';
Vəziyyət 2: İntervalların çıxılmasında qarışıqlıq
İntervalları əlavə və ya çıxanda diqqətli ol:
SELECT NOW() - INTERVAL '-1 day'; -- Bu, gün əlavə edəcək, çıxmayacaq!
Burada ikiqat minus əks effekt yaradır. Belə şeylərdən uzaq dur.
Ovuqlama və kəsmə zamanı səhvlər
Vəziyyət 1: DATE_TRUNC() ilə yanlış kəsmə
DATE_TRUNC() ilə datanı qruplaşdıranda həmişə yoxla ki, düzgün səviyyəni seçmisən. Məsələn:
SELECT DATE_TRUNC('hour', NOW()); -- Saatın əvvəlinə qədər kəsir
SELECT DATE_TRUNC('minute', NOW()); -- Dəqiqənin əvvəlinə qədər kəsir
Əgər bir nəticə gözləyirdin, amma başqa bir şey alındısa, yəqin ki, səviyyəni səhv seçmisən.
Vəziyyət 2: DATE_TRUNC() ilə zaman zonalarını unutmaq
Əgər fərqli zaman zonalarında vaxtla işləyirsənsə, nəticə gözlənilməz ola bilər:
SELECT DATE_TRUNC('day', NOW() AT TIME ZONE 'UTC');
Zaman zonasının düzgün göstərildiyinə əmin ol, yoxsa vaxtda itə bilərsən (həqiqətən).
Unix-time: itirilmiş saniyələr
Unix-time (EPOCH) rahat şeydir, amma hiyləgərdir. Ən yayılmış səhv — saniyə ilə millisekundun qarışdırılmasıdır.
SELECT TO_TIMESTAMP(1680000000); -- Düzgündür (saniyə).
SELECT TO_TIMESTAMP(1680000000000); -- Səhv! Çoxlu sıfır var.
Timestamp-ın nədə ölçüldüyünü yoxla ki, əlavə milyon saniyə saxlamayasan.
Zaman zonaları ilə bağlı səhvlər
Vəziyyət 1: Qarışıq zaman zonaları
Fərqli saat qurşağından istifadəçilərlə işləyəndə datalar qarışa bilər. Məsələn:
SELECT TIMESTAMP '2023-10-01 10:00:00' AT TIME ZONE 'UTC';
Dataların hansı zaman zonasına aid olduğunu dəqiq başa düşdüyünə əmin ol.
Vəziyyət 2: Zaman zonalarının təkrarlanması
Tarix və vaxtı yazıb sonra bir də zaman zonalarını nəzərə almağa çalışmaq — pis fikirdir:
SELECT TIMESTAMP '2023-10-01 10:00:00 UTC' AT TIME ZONE 'UTC'; -- Belə etmə!
Bu, yanlış hesablamalara gətirib çıxara bilər.
Səhvlərin qarşısını almaq üçün tövsiyələr
Uyğun data tipini seç. Əgər beynəlxalq vaxt dataları ilə işləyirsənsə, TIMESTAMPTZ istifadə elə. Yalnız tarix kifayət edirsə, DATE ilə kifayətlən.
Sorgularını test et. Nəticələrin gözləntilərinə uyğun olduğuna əmin ol, xüsusilə intervallar, formatlar və ya yuvarlaqlaşdırma ilə işləyirsənsə.
Vaxt datalarını UTC-də saxla. Zaman zonası qarışıqlığından qaçmaq üçün ən yaxşı yoldur.
Formatları yoxla. TO_CHAR() və TO_DATE() içindəki formatın datana uyğun olduğuna əmin ol.
Funksiyalardan ehtiyatla istifadə et. PostgreSQL vaxt funksiyaları sənədini diqqətlə oxu ki, gözlənilməz sürprizlər olmasın.
Vaxt dataları ilə işləmək bəzən çətin ola bilər, amma düzgün yanaşma və detallara diqqət ilə hər şey problemsiz alınacaq. Tarix və vaxt — tətbiqlərinin vacib hissəsidir və bunu unutmaq, bazar ertəsi səhər üçün zəng qurmağı unutmaq qədər təhlükəlidir!
GO TO FULL VERSION