strftime în SQLite

Dată și oră Toate versiunile SQLite 3

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.

Sintaxă
strftime(format, valoare_timp [, modificator, ...])
-- %Y an  %m lună  %d zi  %H oră  %M minut  %S secundă  %f secunde cu milisecunde
-- %j ziua din an  %W săptămâna din an  %w ziua săptămânii (0 = duminică)  %s timestamp Unix

Ce face strftime

strftime primește un șablon de format și o valoare de timp (aceleași valori și modificatori ca la date()). În șablon, fiecare cod care începe cu % este înlocuit cu o parte a datei, iar restul textului rămâne neschimbat. Rezultatul este întotdeauna text, chiar și pentru %Y sau %s.

Codurile clasice, disponibile în orice SQLite 3: %Y, %m, %d, %H, %M, %S, %f, %j (ziua din an, 001–366), %W (săptămâna din an, săptămânile încep luni), %w (ziua săptămânii, 0 = duminică), %s (secunde de la 1970) și %%. SQLite 3.44.0 a adăugat %F (%Y-%m-%d), %T (%H:%M:%S), %u (1 = luni … 7 = duminică) și altele, iar 3.46.0 săptămâna ISO %V și %G.

SQLite nu știe numele lunilor sau ale zilelor în română (și nici în engleză: nu există %B sau %A). Pentru nume, folosește CASE pe %m sau %w, ori formatează data în aplicație.

Parametri

Parametru Descriere
format Șablonul, cu coduri %.
valoare_timp Data de formatat: text ISO 8601, zi iuliană, timestamp cu 'unixepoch' sau 'now'.

Ce returnează

Text formatat; NULL dacă valoarea de timp nu este validă.

Exemple

Exemplele de pe această pagină pornesc de la datele de mai jos. Rulează mai întâi acest cod, apoi exemplul.

CREATE TABLE plati (
  id    INTEGER PRIMARY KEY,
  data  TEXT NOT NULL,      -- 'AAAA-LL-ZZ HH:MM:SS'
  suma  INTEGER NOT NULL
);
INSERT INTO plati (data, suma) VALUES
  ('2026-08-14 10:20:00', 150),
  ('2026-09-03 18:05:00', 90),
  ('2026-09-28 08:45:00', 210),
  ('2026-10-01 12:00:00', 75),
  ('2026-10-25 21:30:00', 120);

Exemplul 1: Format românesc pentru afișare

Datele rămân în tabel în format ISO, iar strftime le arată ca zi.lună.an. %j și %W dau ziua și săptămâna din an.

SELECT data,
       strftime('%d.%m.%Y %H:%M', data) AS afisare,
       strftime('%j', data)             AS zi_din_an,
       strftime('%W', data)             AS saptamana
FROM plati
ORDER BY data;

Rezultat

╭─────────────────────┬──────────────────┬───────────┬───────────╮
│        data         │     afisare      │ zi_din_an │ saptamana │
╞═════════════════════╪══════════════════╪═══════════╪═══════════╡
│ 2026-08-14 10:20:00 │ 14.08.2026 10:20 │ 226       │ 32        │
│ 2026-09-03 18:05:00 │ 03.09.2026 18:05 │ 246       │ 35        │
│ 2026-09-28 08:45:00 │ 28.09.2026 08:45 │ 271       │ 39        │
│ 2026-10-01 12:00:00 │ 01.10.2026 12:00 │ 274       │ 39        │
│ 2026-10-25 21:30:00 │ 25.10.2026 21:30 │ 298       │ 42        │
╰─────────────────────┴──────────────────┴───────────┴───────────╯

Exemplul 2: Totaluri pe lună

strftime('%Y-%m', data) taie data la nivel de lună, deci toate plățile din aceeași lună intră în același grup.

SELECT strftime('%Y-%m', data) AS luna,
       COUNT(*)                AS plati,
       SUM(suma)               AS total_lei
FROM plati
GROUP BY luna
ORDER BY luna;

Rezultat

╭─────────┬───────┬───────────╮
│  luna   │ plati │ total_lei │
╞═════════╪═══════╪═══════════╡
│ 2026-08 │     1 │       150 │
│ 2026-09 │     2 │       300 │
│ 2026-10 │     2 │       195 │
╰─────────┴───────┴───────────╯

Exemplul 3: Numele zilei în română

%w dă ziua săptămânii ca text, de la '0' (duminică) la '6' (sâmbătă). CASE o transformă în nume. Comparăm cu texte ('0'), pentru că strftime întoarce text.

SELECT data,
       CASE strftime('%w', data)
         WHEN '0' THEN 'duminică' WHEN '1' THEN 'luni'  WHEN '2' THEN 'marți'
         WHEN '3' THEN 'miercuri' WHEN '4' THEN 'joi' WHEN '5' THEN 'vineri'
         ELSE 'sâmbătă'
       END AS zi
FROM plati
ORDER BY data;

Rezultat

╭─────────────────────┬──────────╮
│        data         │    zi    │
╞═════════════════════╪══════════╡
│ 2026-08-14 10:20:00 │ vineri   │
│ 2026-09-03 18:05:00 │ joi      │
│ 2026-09-28 08:45:00 │ luni     │
│ 2026-10-01 12:00:00 │ joi      │
│ 2026-10-25 21:30:00 │ duminică │
╰─────────────────────┴──────────╯

Greșeli frecvente

  • Compari rezultatul cu un număr: WHERE strftime('%m', data) = 10 nu găsește nimic, pentru că strftime întoarce textul '10'. Compară cu '10' sau folosește CAST(strftime('%m', data) AS INTEGER).
  • Folosești %B, %A sau %e pe un SQLite vechi. %B și %A nu există deloc, iar %e, %F, %T, %u există doar din 3.44.0.
  • Filtrezi pe un interval cu strftime aplicat coloanei: WHERE strftime('%Y-%m', data) = '2026-10' nu poate folosi indexul pe data. Scrie WHERE data >= '2026-10-01' AND data < '2026-11-01'.

Comenzi înrudite

  • date, time, datetime: Transformă și calculează date: extrage ziua sau ora, adună zile și luni, găsește începutul lunii sau lunea următoare.
  • 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).