CodeGym /Kurslar /SQL SELF /Unix-vaxt ilə işləmək: EPOCH

Unix-vaxt ilə işləmək: EPOCH

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

Unix-vaxt — sadəcə vaxtı bir ədəd kimi, yəni 1 yanvar 1970-ci il UTC-dən keçən saniyələrin (bəzən millisaniyələrin) sayı kimi yazmaq üsuludur. Bu format dev-lər arasında çox populyardır: saxlamaq, ötürmək və müqayisə etmək asandır, çünki bu sadəcə bir ədəddir.

Sadə dillə desək, Unix-vaxt elə bir taymerdir ki, 1970-ci ildən bəri işləyir və heç dayanmır. 1697222400 kimi qəribə bir ədəd gördün? Qorxma — bu sadəcə başlanğıcdan neçə saniyə keçdiyini göstərir. Hansı tarix olduğunu bilmək istəyirsən? Tezliklə bunu necə hesablamaq lazım olduğunu öyrənəcəyik!

Bu format tez-tez sistemlər arasında məlumat sinxronizasiyası, timestamp-lərin saxlanması və nə vaxt nə baş verdiyini tez müqayisə etmək üçün istifadə olunur.

Unix-vaxta çevirmək

PostgreSQL-də EXTRACT(EPOCH FROM ...) adlı xüsusi bir funksiya var, bununla tarixi və ya timestamp-ı Unix-vaxta çevirə bilərsən.

Gəlin indiki tarixi bu formata çevirək:

SELECT EXTRACT(EPOCH FROM NOW());

Nəticə təxminən belə olacaq:

1697222400

Bu nəticə — sadəcə indiki tarix və vaxtın 1970-ci ildən bəri saniyə ilə ifadəsidir.

Fiks bir tarixi necə çevirmək olar:

SELECT EXTRACT(EPOCH FROM TIMESTAMP '2023-10-01 12:00:00');

Nəticə:

1696152000

İndi bilirik ki, 1 oktyabr 2023, saat 12:00 UTC bu dəyərə uyğundur.

Unix-vaxtdan çevirmək

Təbii ki, əksinə çevirmək üçün də funksiya var. Əgər səndə Unix-vaxtı varsa və onu insan üçün oxunaqlı formata çevirmək istəyirsənsə, TO_TIMESTAMP() funksiyası kömək edəcək.

Unix-vaxtı tarix və vaxta çevirək:

SELECT TO_TIMESTAMP(1697222400);

Nəticə:

2023-10-13 00:00:00+00

İndi görürük ki, bu 13 oktyabr 2023, saat 00:00 UTC-dir.

Unix-vaxtın praktik tətbiqi

Tutaq ki, bizdə events adlı bir cədvəl var və burada hadisələr haqqında məlumatları, o cümlədən onların Unix-vaxt formatında timestamp-lərini saxlayırıq.

CREATE TABLE events (
    id SERIAL PRIMARY KEY,
    event_name TEXT,
    event_time BIGINT -- Unix-vaxtı saxlamaq üçün
);

Bu cədvələ Unix-vaxt formatında timestamp-lərlə məlumat əlavə edə bilərik:

INSERT INTO events (event_name, event_time)
VALUES
('Serverin işə salınması', 1697222400),
('Verilənlər bazasının yenilənməsi', 1697308800);

Bu məlumatı oxunaqlı formata çevirmək üçün TO_TIMESTAMP istifadə etmək kifayətdir:

SELECT event_name, TO_TIMESTAMP(event_time) AS readable_time
FROM events;

Nəticə:

event_name readable_time
Serverin işə salınması 2023-10-13 00:00:00+00
Verilənlər bazasının yenilənməsi 2023-10-14 00:00:00+00

Məsləhətlər və tipik səhvlər

  1. Dəqiqliyin səhv seçilməsi

Əgər Unix-vaxt formatın millisaniyə ilədirsə (məsələn, 1697222400000), onu birbaşa TO_TIMESTAMP funksiyasına vermək və ya EXTRACT ilə istifadə etmək olmaz. Belə hallarda dəyəri 1000-ə bölmək lazımdır:

SELECT TO_TIMESTAMP(1697222400000 / 1000);

Nəticə:

2023-10-13 00:00:00+00
  1. Zaman zonalarını nəzərə almamaq

Unix-vaxt UTC-də göstərilir, ona görə nəticələr həmişə saat qurşağını nəzərə almadan olacaq, əgər xüsusi olaraq vaxtı çevirməsən. Məsələn:

SELECT TO_TIMESTAMP(1697222400) AT TIME ZONE 'Europe/Moscow';

Nəticə:

2023-10-13 03:00:00
  1. Çox böyük ədədlərlə problemlər

Bəzən dev-lər təsadüfən Unix-vaxtı üçün çox böyük dəyər (məsələn, millisaniyə əvəzinə saniyə) göndərirlər. Bu, səhv nəticələrə gətirib çıxarır:

SELECT TO_TIMESTAMP(1697222400000); -- Səhv olacaq!

Bunu düzəltmək üçün ədədi düzgün şəkildə 1000-ə bölmək lazımdır.

Nümunə: tapşırığın yerinə yetirilmə vaxtının hesablanması

Real həyatdan bir nümunə: bizdə tasks adlı tapşırıqlar cədvəli var və hər tapşırığın yaradılmasından nə qədər vaxt keçdiyini hesablamaq istəyirik.

Cədvəli yaradırıq:

CREATE TABLE tasks (
    id SERIAL PRIMARY KEY,
    task_name TEXT,
    created_at TIMESTAMP DEFAULT NOW()
);

Bəzi tapşırıqlar əlavə edirik:

INSERT INTO tasks (task_name)
VALUES
('Tapşırıq 1'),
('Tapşırıq 2'),
('Tapşırıq 3');

İndi Unix-vaxtı olan sütun əlavə edə bilərik:

SELECT id, task_name, EXTRACT(EPOCH FROM created_at) AS created_epoch
FROM tasks;

Nəticə:

id task_name created_epoch
1 Tapşırıq 1 1697222400
2 Tapşırıq 2 1697233200

Və yaradılma anından neçə saniyə keçdiyini hesablayaq:

SELECT id, task_name, EXTRACT(EPOCH FROM NOW()) - EXTRACT(EPOCH FROM created_at) AS elapsed_seconds
FROM tasks;

Nəticə:

id task_name elapsed_seconds
1 Tapşırıq 1 3600
2 Tapşırıq 2 7200

Unix-vaxtı nə vaxt və niyə istifadə etməli?

Unix-vaxt, sistemlər arasında dəyərlərin ötürülməsi, timestamp-lərin müqayisəsi və prosessor yükünü minimuma endirmək lazım olan digər hallarda vaxt məlumatlarını saxlamaq üçün idealdır. O, API-lərdə, web-dev-də, analitikada və server-klient tətbiqlərinin sinxronizasiyasında aktiv istifadə olunur. Amma həmişə onun xüsusiyyətlərini nəzərə almaq lazımdır: UTC-yə yönəlik olması, müxtəlif ölçü vahidləri (saniyə və ya millisaniyə) və saxlama formatı.

Əgər xarici sistemlərlə inteqrasiya zamanı "Unix-vaxt dilində danışan" bir şeylə qarşılaşsan, artıq PostgreSQL-də bununla necə işləmək lazım olduğunu bilirsən. TO_TIMESTAMPEXTRACT(EPOCH) funksiyalarını rahatlıqla istifadə et, çevirmə işlərini həll et və vaxtla bağlı bütün məsələlərin asanlıqla həll olunacaq!

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