CodeGym /Kurslar /SQL SELF /Tarix və vaxtla işləyərkən tipik səhvlər

Tarix və vaxtla işləyərkən tipik səhvlər

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

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()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!

2
Tapşırıq
SQL SELF, səviyyə, dərs
Bağlanıb
Müvəqqəti intervallarla işləmək
Müvəqqəti intervallarla işləmək
1
Sorğu/viktorina
, səviyyə, dərs
Əlçatan deyil
Vaxt zonaları ilə işləmək
Vaxt zonaları ilə işləmək
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION