make_date, make_timestamp, make_interval în PostgreSQL

Construiesc o dată, un timestamp sau un interval din numere separate, fără să lipești texte.

Sintaxă SQL
make_date(an int, luna int, zi int)
make_timestamp(an, luna, zi, ora, minut, secunde double precision)
make_interval(years => 0, months => 0, weeks => 0, days => 0, hours => 0, mins => 0, secs => 0.0)

Ce face make_date, make_timestamp, make_interval

Când anul, luna și ziua sunt în coloane separate (sau vin ca numere dintr-un formular), make_date(2026, 10, 25) creează direct valoarea date. Este mai sigur decât (an || '-' || luna || '-' || zi)::date.

make_timestamp adaugă ora, minutul și secundele. make_interval primește parametri cu nume, de exemplu make_interval(days => 10), util când numărul de zile vine dintr-o coloană.

O dată imposibilă (30 februarie) dă eroare în loc să fie mutată în altă zi.

Parametri

Parametru Descriere
an, luna, zi Numere întregi. Un an negativ înseamnă î.Hr.
ora, minut, secunde Pentru make_timestamp; secundele pot avea zecimale.
years, months, weeks, days, hours, mins, secs Pentru make_interval; se dau cu nume (days => 3).

Ce returnează

date, timestamp (fără fus orar), respectiv interval.

Exemple

Exemplul 1: Valori construite din numere

SELECT make_date(2026, 10, 25) AS data,
       make_timestamp(2026, 10, 25, 14, 30, 0) AS moment,
       make_interval(days => 10) AS zece_zile,
       make_interval(hours => 2, mins => 30) AS durata;

Rezultat în psql

    data    |       moment        | zece_zile |  durata  
------------+---------------------+-----------+----------
 2026-10-25 | 2026-10-25 14:30:00 | 10 days   | 02:30:00
(1 row)

Exemplul 2: Termen de plată din coloane

SELECT numar, make_date(an, luna, zi) + make_interval(days => zile_plata) AS scadenta
FROM facturi;

Rezultat în psql

 numar  |      scadenta       
--------+---------------------
 F-1001 | 2026-11-24 00:00:00
 F-1002 | 2026-11-09 00:00:00
(2 rows)

Exemplul 3: Dată care nu există

SELECT make_date(2026, 2, 30);

Rezultat în psql

ERROR:  date field value out of range: 2026-02-30

Greșeli frecvente

  • Aduni un interval la o dată și te aștepți tot la date: date + interval dă timestamp. Pentru un număr de zile folosește date + integer (make_date(...) + 30).
  • Dai parametrii lui make_interval fără nume și în altă ordine decât cea din definiție. Numește-i: make_interval(days => 3).

Comenzi înrudite

  • age: Calculează diferența dintre două date ca interval „simbolic”, în ani, luni și zile, de exemplu vârsta unei persoane.