unixepoch, julianday, timediff în SQLite

Dată și oră SQLite 3.38.0

Transformă datele în numere (timestamp Unix sau zi iuliană) ca să calculezi diferențe în secunde, ore sau zile.

Sintaxă
unixepoch(valoare_timp [, modificator, ...])   -- 3.38.0: secunde de la 1970-01-01 (INTEGER)
julianday(valoare_timp [, modificator, ...])   -- zi iuliană (REAL)
timediff(timp1, timp2)                         -- 3.43.0: '+AAAA-LL-ZZ HH:MM:SS.SSS'
datetime(numar, 'unixepoch')                   -- timestamp Unix înapoi în dată

Ce face unixepoch, julianday, timediff

Ca să afli câte zile sau ore sunt între două momente, transformi datele în numere și le scazi. unixepoch() (din SQLite 3.38.0) întoarce numărul întreg de secunde de la 1 ianuarie 1970, ora 00:00 UTC; diferența a două valori este în secunde. julianday(), disponibilă de mult mai mult timp, întoarce numărul zilei iuliene ca număr real; diferența a două valori este în zile, cu zecimale pentru ore.

Drumul invers: datetime(1792929600, 'unixepoch') transformă un timestamp Unix în text. Dacă stochezi date ca numere, acesta este modul de a le afișa. Din 3.38.0 există și modificatorul 'auto', care ghicește dacă numărul este zi iuliană sau timestamp Unix.

timediff(a, b) (din 3.43.0) întoarce diferența a - b ca text de forma +AAAA-LL-ZZ HH:MM:SS.SSS: ani, luni, zile și ore întregi, ca o vârstă. Este util pentru afișare; pentru calcule (sume, medii) folosește diferențele numerice.

Parametri

Parametru Descriere
valoare_timp Orice valoare acceptată de date(), cu modificatori opționali.
timp1, timp2 La timediff: cele două momente; rezultatul este timp1 - timp2.

Ce returnează

unixepoch: INTEGER; julianday: REAL; timediff: TEXT.

Exemple

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

CREATE TABLE inchirieri (
  client  TEXT NOT NULL,
  inceput TEXT NOT NULL,    -- 'AAAA-LL-ZZ HH:MM:SS'
  sfarsit TEXT NOT NULL
);
INSERT INTO inchirieri VALUES
  ('Ana',  '2026-10-20 09:00:00', '2026-10-22 18:30:00'),
  ('Vlad', '2026-10-24 10:15:00', '2026-10-24 16:45:00');

Exemplul 1: Din dată în timestamp și înapoi

Timestamp-ul este în UTC. Adunând 86.400 de secunde (o zi) și transformând înapoi cu 'unixepoch' obții ziua următoare.

SELECT unixepoch('2026-10-25 12:00:00')               AS timestamp,
       datetime(1792929600, 'unixepoch')              AS inapoi,
       datetime(1792929600 + 86400, 'unixepoch')      AS a_doua_zi,
       julianday('2026-10-25 12:00:00')               AS zi_iuliana;

Rezultat

╭────────────┬─────────────────────┬─────────────────────┬────────────╮
│ timestamp  │       inapoi        │      a_doua_zi      │ zi_iuliana │
╞════════════╪═════════════════════╪═════════════════════╪════════════╡
│ 1792929600 │ 2026-10-25 12:00:00 │ 2026-10-26 12:00:00 │  2461339.0 │
╰────────────┴─────────────────────┴─────────────────────┴────────────╯

Exemplul 2: Durata fiecărei închirieri

Diferența de unixepoch este în secunde; împărțită la 3.600 dă ore. Diferența de julianday este direct în zile. round păstrează două zecimale.

SELECT client,
       unixepoch(sfarsit) - unixepoch(inceput)                   AS secunde,
       round((unixepoch(sfarsit) - unixepoch(inceput)) / 3600.0, 2) AS ore,
       round(julianday(sfarsit) - julianday(inceput), 2)         AS zile
FROM inchirieri
ORDER BY client;

Rezultat

╭────────┬─────────┬──────┬──────╮
│ client │ secunde │ ore  │ zile │
╞════════╪═════════╪══════╪══════╡
│ Ana    │  207000 │ 57.5 │  2.4 │
│ Vlad   │   23400 │  6.5 │ 0.27 │
╰────────┴─────────┴──────┴──────╯

Exemplul 3: timediff pentru durate și vârste

Închirierea Anei a durat 2 zile și 9 ore și jumătate. A doua coloană arată vârsta cuiva născut pe 15 martie 1990, la data de 25 octombrie 2026: 36 de ani, 7 luni și 10 zile. Numărul de zile dintre două date se obține și din diferența de julianday.

SELECT timediff(sfarsit, inceput) AS durata
FROM inchirieri WHERE client = 'Ana';

SELECT timediff('2026-10-25', '1990-03-15') AS varsta,
       CAST(julianday('2026-12-25') - julianday('2026-10-25') AS INTEGER) AS zile_pana_la_craciun;

Rezultat

╭──────────────────────────╮
│          durata          │
╞══════════════════════════╡
│ +0000-00-02 09:30:00.000 │
╰──────────────────────────╯
╭──────────────────────────┬──────────────────────╮
│          varsta          │ zile_pana_la_craciun │
╞══════════════════════════╪══════════════════════╡
│ +0036-07-10 00:00:00.000 │                   61 │
╰──────────────────────────┴──────────────────────╯

Greșeli frecvente

  • Împarți secundele la 3600 (întreg) și pierzi zecimalele: 23400 / 3600 dă 6, nu 6,5. Împarte la 3600.0.
  • Uiți că unixepoch și 'unixepoch' lucrează în UTC. Un timestamp afișat fără 'localtime' poate părea cu 2–3 ore în urmă față de ora României.
  • Compari direct rezultatul lui julianday cu un număr întreg de zile. Fiind REAL, 297.0 și 296.99999 pot apărea din calcule cu ore; rotunjește cu round sau CAST(... AS INTEGER).

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.
  • 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.
  • 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.