date, time, datetime în SQLite

Dată și oră Toate versiunile SQLite 3

Transformă și calculează date: extrage ziua sau ora, adună zile și luni, găsește începutul lunii sau lunea următoare.

Sintaxă
date(valoare_timp [, modificator, ...])        -- 'AAAA-LL-ZZ'
time(valoare_timp [, modificator, ...])        -- 'HH:MM:SS'
datetime(valoare_timp [, modificator, ...])    -- 'AAAA-LL-ZZ HH:MM:SS'
-- modificatori: '+N days', '-N months', '+N hours', 'start of month',
--   'start of year', 'start of day', 'weekday N', 'unixepoch', 'localtime', 'utc'

Ce face date, time, datetime

SQLite nu are un tip special pentru dată. Datele se păstrează de obicei ca text în formatul ISO 8601 ('2026-10-25 14:30:00'), care se sortează corect și ca text. Funcțiile date, time și datetime citesc o astfel de valoare (sau un număr de zi iuliană, sau un timestamp Unix cu modificatorul 'unixepoch') și întorc data, ora sau ambele, tot ca text.

După valoare poți pune oricâți modificatori, aplicați de la stânga la dreapta: '+30 days', '-1 month', '+2 hours', 'start of month' (prima zi a lunii), 'weekday 1' (următoarea zi de luni, sau aceeași zi dacă este deja luni). Valoarea 'now' înseamnă momentul curent, în UTC; 'localtime' o transformă în ora locală a calculatorului.

Adunarea de luni la o zi care nu există în luna nouă (31 ianuarie + 1 lună) „curge” în luna următoare: rezultatul este 3 martie. Din SQLite 3.46.0, modificatorul 'floor' dă în schimb ultima zi a lunii (28 februarie), iar 'ceiling' păstrează comportamentul implicit. Un text care nu poate fi citit ca dată dă NULL, nu eroare; o zi între 29 și 31 care nu există în luna respectivă este însă acceptată și mutată în luna următoare.

Parametri

Parametru Descriere
valoare_timp Text ISO 8601 ('AAAA-LL-ZZ', 'AAAA-LL-ZZ HH:MM[:SS]'), număr de zi iuliană, timestamp Unix (cu 'unixepoch') sau 'now'.
modificator Transformări aplicate în ordine: adunări, 'start of ...', 'weekday N' (0 = duminică), 'localtime', 'utc'.

Ce returnează

Text: AAAA-LL-ZZ, HH:MM:SS sau AAAA-LL-ZZ HH:MM:SS; NULL pentru intrări invalide.

Exemple

Exemplul 1: Data, ora și amândouă

Din același moment, date păstrează doar data, time doar ora. Ultimele coloane arată două capcane: o zi prea mare pentru lună (31 noiembrie) nu dă eroare, ci trece în luna următoare, iar un text în alt format (25.10.2026) dă NULL.

SELECT date('2026-10-25 14:30:00')     AS data,
       time('2026-10-25 14:30:00')     AS ora,
       datetime('2026-10-25 14:30')    AS complet,
       date('2026-11-31')              AS zi_prea_mare,
       date('25.10.2026')              AS alt_format;

Rezultat

╭────────────┬──────────┬─────────────────────┬──────────────┬────────────╮
│    data    │   ora    │       complet       │ zi_prea_mare │ alt_format │
╞════════════╪══════════╪═════════════════════╪══════════════╪════════════╡
│ 2026-10-25 │ 14:30:00 │ 2026-10-25 14:30:00 │ 2026-12-01   │            │
╰────────────┴──────────┴─────────────────────┴──────────────┴────────────╯

Exemplul 2: Scadențe, sfârșit de lună și lunea următoare

O factură emisă pe 25 octombrie are scadența peste 30 de zile. Ultima zi a lunii se obține cu „începutul lunii, plus o lună, minus o zi”. 25 octombrie 2026 este duminică, deci 'weekday 1' dă luni, 26 octombrie.

SELECT date('2026-10-25', '+30 days')                          AS scadenta,
       date('2026-10-25', 'start of month', '+1 month', '-1 day') AS ultima_zi_luna,
       date('2026-10-25', 'weekday 1')                         AS lunea_urmatoare,
       datetime('2026-10-25 22:15:00', '+3 hours')             AS peste_3_ore;

Rezultat

╭────────────┬────────────────┬─────────────────┬─────────────────────╮
│  scadenta  │ ultima_zi_luna │ lunea_urmatoare │     peste_3_ore     │
╞════════════╪════════════════╪═════════════════╪═════════════════════╡
│ 2026-11-24 │ 2026-10-31     │ 2026-10-26      │ 2026-10-26 01:15:00 │
╰────────────┴────────────────┴─────────────────┴─────────────────────╯

Exemplul 3: Luni de lungimi diferite și modificatorul floor

31 ianuarie + 1 lună ar fi „31 februarie”, care nu există, așa că SQLite merge mai departe, la 3 martie. Cu 'floor' (3.46.0+) rezultatul rămâne în februarie. A doua coloană arată prima zi a lunii următoare, care nu are această problemă.

SELECT date('2026-01-31', '+1 month')            AS implicit,
       date('2026-01-31', '+1 month', 'floor')   AS cu_floor,
       date('2026-01-31', 'start of month', '+1 month') AS prima_zi_luna_urmatoare;

Rezultat

╭────────────┬────────────┬─────────────────────────╮
│  implicit  │  cu_floor  │ prima_zi_luna_urmatoare │
╞════════════╪════════════╪═════════════════════════╡
│ 2026-03-03 │ 2026-02-28 │ 2026-02-01              │
╰────────────┴────────────┴─────────────────────────╯

Greșeli frecvente

  • Păstrezi datele în format românesc ('25.10.2026'). Funcțiile de dată nu îl recunosc (întorc NULL), iar sortarea ca text nu mai este cronologică. Păstrează ISO 8601 și formatează doar la afișare, cu strftime.
  • Folosești 'now' și te aștepți la ora României. 'now' este în UTC; adaugă 'localtime' sau păstrează totul în UTC și convertește în aplicație.
  • Scrii luna sau ziua fără zero în față ('2026-1-5'). Formatul trebuie să fie exact AAAA-LL-ZZ, altfel rezultatul este NULL.

Comenzi înrudite

  • strftime: Formatează o dată după un șablon ales de tine (de exemplu 25.10.2026 09:05) sau extrage din ea anul, luna, ziua săptămânii.
  • unixepoch, julianday, timediff: Transformă datele în numere (timestamp Unix sau zi iuliană) ca să calculezi diferențe în secunde, ore sau zile.
  • WITH RECURSIVE: Un CTE care se folosește pe el însuși: generează serii de numere sau de date și parcurge ierarhii (șef–subordonat, categorii).
  • SUM() OVER: totaluri cumulate și medii mobile: Folosește SUM, AVG, COUNT, MIN și MAX ca funcții fereastră: totaluri cumulate, medii pe ultimele zile, procente din total.