Yüksek hassasiyetli tarih/saat eklentisi
SQLite temel tarih fonksiyonları sunuyor, ancak daha fazla işleve ihtiyaç duyulduğu için sqlean-time adlı yüksek hassasiyetli tarih/saat eklentisi oluşturulmuş. Bu eklenti, yapılandırılmış bir API ve çeşitli özellikler sunuyor.
Not. SQLite'a eklenti eklemek oldukça kolay. Dosyayı indirip veritabanında tek bir komut çalıştırmanız yeterli.
Kavramlar
Bu eklenti iki tür değer kullanır: zaman (Time) ve süre (Duration).
-
zaman (Time): saniye ve nanosaniyeden oluşan bir çift olup, 0 zamanından (0001-01-01 00:00:00 UTC) sonraki saniyeleri ve mevcut saniye içindeki nanosaniyeleri temsil eder.
- Zamanı dahili gösterimle saklayabilirsiniz; bu da milyarlarca yıl öncesi ve sonrasındaki tarihleri nanosaniye hassasiyetiyle ifade etmeyi mümkün kılar.
- Zaman, Unix epoch'tan (1970-01-01 00:00:00 UTC) sonraki saniye olarak da saklanabilir; buna milisaniye, mikrosaniye ve nanosaniye dahildir.
- Zaman her zaman UTC olarak saklanır ve işlenir, ancak belirli bir saat dilimi ofsetine dönüştürülebilir.
-
süre (Duration): nanosaniye cinsinden 64 bitlik bir sayı olup, yaklaşık 290 yıla kadar olan değerleri temsil edebilir.
Zaman değeri oluşturma
-
Şu anki zaman:
select time_fmt_iso(time_now()); -- 2024-08-06T21:22:15.431295000Z -
Belirli bir tarih/saat:
select time_fmt_iso(time_date(2011, 11, 18)); -- 2011-11-18T00:00:00Z select time_fmt_iso(time_date(2011, 11, 18, 15, 56, 35)); -- 2011-11-18T15:56:35Z
Zaman alanlarını çıkarma
Çeşitli tarih/saat alanlarını çıkaran fonksiyonlar vardır:
select 'year = ' || time_get_year(time_now());
select 'month = ' || time_get_month(time_now());
select 'day = ' || time_get_day(time_now());
Unix zamanı
Unix zamanından (1970-01-01 UTC sonrasındaki zaman) zaman değeri oluşturan fonksiyonlar:
select time_fmt_iso(time_unix(1321631795)); -- 2011-11-18T15:56:35Z
Zaman değerini Unix zamanına dönüştüren fonksiyonlar:
select time_to_unix(time_now()); -- 1722979335
Zaman karşılaştırma
Zaman değerlerini karşılaştıran fonksiyonlar:
select time_after(time_now(), time_date(2011, 11, 18)); -- 1
select time_before(time_now(), time_date(2011, 11, 18)); -- 0
Zaman işlemleri
Süreyi zaman değerine ekleyen fonksiyonlar:
select time_fmt_iso(time_add(time_now(), 24*dur_h())); -- 2024-08-07T21:22:15.431295000Z
Süre sabitleri:
dur_us()- 1 mikrosaniyedur_ms()- 1 milisaniyedur_s()- 1 saniyedur_m()- 1 dakikadur_h()- 1 saat
Yuvarlama
Zaman değerini belirtilen alan hassasiyetine göre yuvarlayan fonksiyonlar:
select 'original = ' || time_fmt_iso(t.v) from t union all
select 'millennium = ' || time_fmt_iso(time_trunc(t.v, 'millennium')) from t;
Biçimlendirme
ISO 8601 zaman dizgesi döndüren fonksiyonlar:
select time_fmt_iso(time_date(2011, 11, 18, 15, 56, 35, 666777888), 3*3600); -- 2011-11-18T18:56:35.666777888+03:00
Süre sabitleri
Yaygın süreleri nanosaniye olarak döndüren fonksiyonlar:
select dur_ns(); -- 1
select dur_us(); -- 1000
Teşekkürler
Bu eklenti C ile uygulanmış ve Go'nun standart kütüphanesindeki time paketi (BSD 3-Clause License) temel alınarak tasarlanıp uygulanmıştır.
Kurulum ve kullanım
- En son sürümü indirin
- SQLite komut satırı arayüzünde kullanın:
sqlite> .load ./time sqlite> select time_now();
GN⁺ Özeti
sqlean-timeeklentisi, SQLite'a yüksek hassasiyetli tarih/saat işlevleri ekleyerek çeşitli zaman işlemlerini mümkün kılar.- Zaman ve süre nanosaniye düzeyinde işlenebilir; bu da son derece hassas zaman hesaplamaları sağlar.
- Çeşitli zaman biçimlendirme ve karşılaştırma işlevleri sunarak geliştiricilerin kolayca kullanabilmesini sağlar.
- SQLite'ın temel tarih fonksiyonlarından çok daha fazla özellik sunduğu için karmaşık zaman işlemleri gerektiren projelerde faydalıdır.
1 yorum
Hacker News yorumları
Jon Skeet'in belgelediği saat dilimi değişiklikleri ve yerel zaman süreksizliklerinin özel durumlarını ele alıp almadığına dair soru
Tarih/saat ve kriptografi kütüphanelerini kendiniz oluşturmamanın daha iyi olduğu
Üç farklı zaman gösterimi/ölçeğinin ilginç olduğu
Signed integer kullanılıp kullanılmadığını netleştirmenin önemli olduğu
Keşke SQLite3'te genişletilebilir bir type system olsaydı
SQLite'ta önemli bir eksik özelliğe değinip bunu çok havalı bulduğu
Veritabanının birimleri takip etmesi gerektiğini savunma
"2h"ifadesini 7200.0 saniyeye dönüştürebilmeli ve tablo taraması sırasında karşılaştırabilmeliNanosaniye gösterimi ile nanosaniye aralığı dışındaki yıllar arasında hangisinin daha kullanışlı olduğuna dair soru
Golang tarzı Unix timestamp'i nanosaniye cinsinden, signed int64 olarak kullanma önerisi
"epoch sonrası saniye" ifadesinin tam olarak ne anlama geldiği kesin değilse kullanılmaması gerektiğini savunma
select time_sub(time_date(2011, 11, 19), time_date(1311, 11, 18));