2 puan yazan GN⁺ 2024-08-16 | 1 yorum | WhatsApp'ta paylaş

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 mikrosaniye
  • dur_ms() - 1 milisaniye
  • dur_s() - 1 saniye
  • dur_m() - 1 dakika
  • dur_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

  1. En son sürümü indirin
  2. SQLite komut satırı arayüzünde kullanın:
    sqlite> .load ./time
    sqlite> select time_now();
    

GN⁺ Özeti

  • sqlean-time eklentisi, 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

 
GN⁺ 2024-08-16
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

    • İlgili bağlantı: Stack Overflow
    • Computerphile'ın 10 dakikalık video açıklaması bağlantısı: YouTube
  • Tarih/saat ve kriptografi kütüphanelerini kendiniz oluşturmamanın daha iyi olduğu

    • Sonsuz edge case sorun çıkarabilir
    • Yeni bir kütüphaneyle karşılaşınca şüpheci olma nedeni
  • Üç farklı zaman gösterimi/ölçeğinin ilginç olduğu

    • Milyarlarca yıllık süreler boyunca nanosaniye hassasiyetinin gerekli olduğu kullanım senaryolarının merak edilmesi
    • Nanosaniye hassasiyetinde yalnızca ±290 yıllık aralık sunulmasının kafa karıştırıcı olması
  • Signed integer kullanılıp kullanılmadığını netleştirmenin önemli olduğu

    • Doküman okununca signed integer da olabilir olmayabilir de gibi görünüyor
    • Signed integer ise, aynı tarih ve saati temsil eden birden fazla bit dizisi olabilir
  • 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

    • Örneğin, bir zaman sütununun float64 saniye biriminde olduğunu belirtmek mümkün olmalı
    • Veritabanı "2h" ifadesini 7200.0 saniyeye dönüştürebilmeli ve tablo taraması sırasında karşılaştırabilmeli
    • Geçmişte böyle birim işleme yapan özel amaçlı bir SQL veritabanı yazmış ama o zamandan beri bir daha görmemiş
    • Yalnızca zamanı değil, kütle, hacim, bilgi, sıcaklık gibi tüm birimleri işleyebilmesi gerektiği
    • Matematiksel hataları erken yakalamak için veritabanına matematiksel olarak anlamsız işlemleri reddetmeyi öğretmenin mümkün olduğu
  • Nanosaniye gösterimi ile nanosaniye aralığı dışındaki yıllar arasında hangisinin daha kullanışlı olduğuna dair soru

    • "Kesin" bilim yapılmadığı için nanosaniyenin değerinin sınırlı olduğu
    • Tarihsel tarihleri temsil edebilmenin daha sık gerekli olacağının düşünüldüğü
  • Golang tarzı Unix timestamp'i nanosaniye cinsinden, signed int64 olarak kullanma önerisi

    • Nanosaniye hassasiyetiyle milyonlarca yılı kapsamayabilir ama buna gerçekten ihtiyaç olup olmadığı sorgulanıyor
  • "epoch sonrası saniye" ifadesinin tam olarak ne anlama geldiği kesin değilse kullanılmaması gerektiğini savunma

    • Örnek sorgu: select time_sub(time_date(2011, 11, 19), time_date(1311, 11, 18));