Menu

SQLite Tarih ve Saat: strftime, date(), datetime()

SQLite tarihleri nasıl saklar ve işler? Beş tarih fonksiyonu, format dizeleri, modifier'lar ve sorgularınızı hızlı tutacak depolama tercihleri.

Bu sayfada çalıştırılabilir editörler var — düzenle, çalıştır ve sonucu anında gör.

SQLite'da Aslında Tarih Tipi Yoktur

Postgres ya da MySQL'den gelen herkesin takıldığı nokta budur. SQLite'ın yalnızca beş depolama sınıfı vardır: NULL, INTEGER, REAL, TEXT, BLOB. Yani DATE, DATETIME veya TIMESTAMP diye bir şey yok. CREATE TABLE içinde created_at DATETIME yazabilirsiniz ve SQLite bunu kabul eder, ama değeri arka planda düz metin ya da sayı olarak saklar.

SQLite'ın size sunduğu şey, üç yaygın biçimi anlayan bir dizi sqlite tarih fonksiyonudur:

  • ISO 8601 metin'2026-04-23', '2026-04-23 10:15:00', '2026-04-23T10:15:00.123Z'.
  • Unix timestamp — 1970-01-01 UTC'den bu yana geçen saniye sayısı, integer olarak tutulur.
  • Jülyen gün numarası — MÖ 4714'ten bu yana geçen kesirli gün sayısı, real olarak tutulur.

Birini seçin ve hep ona sadık kalın. ISO 8601 metni hem en okunaklı olanı hem de string olarak doğru sıralandığı için varsayılan tercih budur.

"Şu an"ı sormanın dört yolu — metin tarih, metin tarih-saat, Unix saniyesi ve Julian günü. Hepsi de aynı anı ifade eder.

Beş Tarih Fonksiyonu

SQLite, ihtiyacının neredeyse tamamını karşılayan beş hazır tarih fonksiyonu sunar:

  • date(time, ...)YYYY-MM-DD döndürür.
  • time(time, ...)HH:MM:SS döndürür.
  • datetime(time, ...)YYYY-MM-DD HH:MM:SS döndürür.
  • julianday(time, ...) — gerçel sayı döndürür (tarih farkı hesaplamak için birebir).
  • strftime(format, time, ...) — istediğiniz biçimde formatlanmış bir string döndürür.

Her biri ilk argüman olarak bir zaman değeri alır, ardından istediğiniz kadar değiştirici (modifier) string ekleyebilirsiniz.

'unixepoch' ifadesine dikkat — bu, tarih fonksiyonlarına gelen tam sayının Julian günü değil, Unix timestamp olduğunu söyleme şeklin. Bunu yazmazsan SQLite sayıyı doğrudan Julian gün sayısı olarak yorumluyor.

strftime: Özel Tarih Formatları

İşin asıl yükünü çeken fonksiyon strftime. C veya Python'dan tanıdığınız % kodlarının aynısını burada da kullanabilirsiniz:

En sık kullanacağın kodlar:

  • %Y — dört haneli yıl.
  • %m — ay (01-12).
  • %d — ayın günü (01-31).
  • %H, %M, %S — saat, dakika, saniye.
  • %w — haftanın günü (0=Pazar).
  • %j — yılın kaçıncı günü (001-366).
  • %s — Unix timestamp.
  • %f — saniyenin ondalık kısmı (SS.SSS).

SQLite'ta bir tarihin belirli bir parçasını çekmek için de yine strftime kullanılır — ayrı bir EXTRACT ya da YEAR() fonksiyonu yoktur. İhtiyacın olan parçaya kadar formatlarsınız, sayı olarak lazımsa cast edersiniz:

strftime her zaman metin döndürür; sayısal karşılaştırma ya da aritmetik işlem yapmak istiyorsanız CAST(... AS INTEGER) ile sarmalamayı unutma.

Modifier'lar: Operatöre gerek kalmadan tarih hesabı

SQLite'ta tarih işlemlerini bu kadar keyifli kılan asıl özellik bu. Zaman argümanından sonra istediğiniz kadar modifier (değiştirici) dizesi geçebilirsiniz; bunlar sırayla uygulanır:

Sürekli kullanacağın modifier'lar şunlar:

  • '+N days', '-N days' ve aynı şekilde hours, minutes, seconds, months, years.
  • 'start of day', 'start of month', 'start of year' — tarihi ilgili sınıra yuvarlar.
  • 'weekday N' — bir sonraki belirtilen güne ilerletir (0=Pazar).
  • 'localtime' ve 'utc' — saat dilimleri arasında dönüşüm yapar.

"Ayın son günü" numarasını — ayın başına git, bir ay ekle, bir gün çıkar — ezberlemeye değer. SQLite'ta LAST_DAY diye bir fonksiyon yok ama modifier'ları zincirleyince aynı sonucu alıyorsunuz.

UTC ve Yerel Saat

'now' her zaman UTC döndürür. Yerel saati istiyorsanız açıkça belirtmeniz gerekir:

'localtime' değiştiricisi UTC değerini sistemin yerel saat dilimine çevirir. 'utc' değiştiricisi ise tam tersini yapar: girdiyi yerel saat olarak kabul edip UTC'ye dönüştürür.

Güvenli alışkanlık şu: her şeyi UTC olarak sakla, sadece ekrana basarken yerel saate çevir. Saklama tarafında saat dilimlerini karıştırırsanız, yılda iki kez yaz saati uygulamasıyla birlikte ortaya çıkan, bulması zor hatalarla uğraşırsınız.

SQLite Tarih Karşılaştırma ve Aralık Filtreleme

Tarihleri ISO 8601 metin formatında saklıyorsanız, karşılaştırma ve BETWEEN ifadesi sorunsuz çalışır. Çünkü ISO 8601 sözlük sırasına göre sıralandığında kronolojik sırayla aynı sonucu verir. Zaten varsayılan format olmasının asıl sebebi de bu.

Yarı açık aralık (>= başlangıç, < bitiş) kullanmak çok faydalı bir alışkanlıktır — "30'unun gece yarısı dahil mi, değil mi?" sorusunu kökten ortadan kaldırır.

"Son 7 gün" için sınırı SQLite'a hesaplatın:

Tarih Farkı Hesaplama

SQLite'ta DATEDIFF diye bir fonksiyon yok. Ama merak etmeyin, aşağıdaki iki yöntem işinizi fazlasıyla görür:

julianday() farkları gün cinsinden (ondalıklı hassasiyetle) döner; yani 24 ile çarparsanız saati, 1440 ile çarparsanız dakikayı elde edersiniz. strftime('%s', ...) farkları ise saniye cinsindendir — tam sayı istediğinde işini görür.

Tam gün sayısı istiyorsanız CAST(... AS INTEGER) ondalıklı kısmı keser:

Tarihleri Saklamak: Bir Format Seç ve Ona Sadık Kal

Aklı başında üç seçenek var, sıklık sırasına göre:

  1. ISO 8601 metni (TEXT). Dump çıktılarında okunabilir, düzgün sıralanır ve tüm sqlite tarih fonksiyonlarıyla sorunsuz çalışır. Varsayılan tercihiniz bu olsun.
  2. Unix saniyeleri (INTEGER). Kompakt, karşılaştırmaları hızlı, zaman dilimi belirsizliği yok. Milyonlarca kaydınız varsa tercih edin. Geri okumak için datetime(col, 'unixepoch') kullanmanız gerekecek.
  3. Julian day (REAL). Yoğun tarih aritmetiği yapmıyorsanız ve tek bir sütunda saniye altı hassasiyet istemiyorsanız genelde zahmete değmez.

Yapmamanız gereken şey ise aynı sütunda formatları karıştırmak. Tarih fonksiyonları her ikisini de sessizce kabul eder; ama indeksler, sıralamalar ve karşılaştırmalar size saçma sonuçlar üretir.

DEFAULT (datetime('now')), SQLite'taki DEFAULT CURRENT_TIMESTAMP karşılığıdır — hiç uygulama kodu yazmadan her yeni satıra anlık UTC zamanını basar.

Zaman Aralığına Göre Gruplama

Satırları aya, haftaya ya da saate göre kümelemek istediğinizde strftime tam olarak burada parlıyor:

Aynı mantığı "saatlik sipariş sayısı", "haftanın gününe göre kayıt olanlar" veya "dakika başına olay sayısı" gibi sorgulara da uygulayabilirsiniz — ihtiyacınız olan ayrıntı düzeyini yakalayan bir format string seçin, ona göre gruplayın ve toplama yapın.

Sırada: Aggregate Fonksiyonlar

Madem gruplamadan bahsettik — yukarıdaki COUNT(*), SQLite'ın aggregate fonksiyonları arasında en basit olanıdır. Bir sonraki konuda bunların tamamına bakacağız: SUM, AVG, MIN, MAX ve birden çok satırı tek bir özet değere nasıl indirgediklerine.

Sıkça Sorulan Sorular

SQLite'ta DATE veya DATETIME veri tipi var mı?

Hayır, SQLite'ın özel bir tarih tipi yok. Tarihleri ya TEXT olarak ISO 8601 formatında ('2026-04-23 10:15:00'), ya Unix timestamp olarak INTEGER, ya da Julian day olarak REAL şeklinde saklarsınız. Yerleşik tarih fonksiyonları üç formatı da kabul eder ve varsayılan olarak ISO 8601 metni döner.

SQLite'ta şu anki tarih ve saati nasıl alırım?

Sadece tarih için date('now'), sadece saat için time('now'), ikisi birden için datetime('now'), Unix timestamp için ise strftime('%s', 'now') kullanın. Bu fonksiyonlar varsayılan olarak UTC döner; yerel saate çevirmek için modifier olarak 'localtime' ekleyin: datetime('now', 'localtime').

SQLite'ta bir tarihe gün veya ay nasıl eklenir?

Herhangi bir tarih fonksiyonuna modifier dizesi geçirmeniz yeterli: date('2026-04-23', '+7 days'), date('now', '-1 month'), datetime('now', '+2 hours', '+30 minutes'). Modifier'lar sırayla zincirlenir; kullanabileceğiniz birimler arasında days, hours, minutes, seconds, months ve years var.

İki tarih arasındaki farkı nasıl hesaplarım?

Gün cinsinden fark için julianday(end) - julianday(start) kullanın; Julian günleri ondalıklı olduğundan sonuç gün kesirlerini de içerir. Saniye cinsinden fark için Unix timestamp'leri çıkarın: strftime('%s', end) - strftime('%s', start). SQLite'ta DATEDIFF fonksiyonu yoktur ama bu iki kalıp neredeyse her durumu karşılar.

Coddy programming languages illustration

Coddy ile kodlamayı öğren

BAŞLA