Per inserire una data in SQL, scrivila nell'istruzione INSERT come stringa 'YYYY-MM-DD', oppure usa una funzione come CURRENT_DATE per la data di oggi. Gli esempi funzionano in PostgreSQL, MySQL, SQLite e SQL Server.
Come inserire una data in SQL
Scrivi la data come stringa nel formato 'YYYY-MM-DD'. Se la colonna è di tipo data, il database converte la stringa in una data:
INSERT INTO table_name (date_column) VALUES ('YYYY-MM-DD');
INSERT INTO orders (order_id, customer, order_date)
VALUES (2, 'Tom', '2021-06-15');
Per una colonna TIMESTAMP o DATETIME, aggiungi l'ora dopo uno spazio, nel formato 24 ore:
INSERT INTO flights (flight_no, departs_at)
VALUES ('UA 940', '2026-11-02 17:45:00');
-- In SQL Server, make departs_at a DATETIME2: its TIMESTAMP type isn't a date
Per la data di oggi, metti CURRENT_DATE al posto della stringa, senza virgolette. CURRENT_TIMESTAMP restituisce data e ora:
INSERT INTO orders (order_id, customer, order_date)
VALUES (3, 'Priya', CURRENT_DATE);
-- In SQL Server, use CAST(GETDATE() AS DATE): it has no CURRENT_DATE
-- Output (the new row, run on 2026-10-13):
-- order_id | customer | order_date
-- ---------+----------+-----------
-- 3 | Priya | 2026-10-13
Regole da conoscere
-
Usa sempre
'YYYY-MM-DD'. Gli altri formati dipendono dalle impostazioni del database. PostgreSQL e SQL Server leggono'06/15/2021'come mese/giorno/anno, mentre MySQL lo rifiuta:
INSERT INTO orders (order_id, customer, order_date) VALUES (4, 'Ana', '06/15/2021');
-- MySQL: ERROR 1292 (22007): Incorrect date value: '06/15/2021' for column 'order_date' at row 1
-
SQLite non controlla le date. Non ha un tipo data e salva qualsiasi testo gli passi. Le sue funzioni per le date non sanno leggere
'06/15/2021'e trasformano'2021-02-30'in2021-03-02. -
Il
TIMESTAMPdi MySQL copre solo dal 1970 al 2038. UsaDATETIMEper compleanni, date storiche e qualsiasi data molto lontana nel futuro:
-- MySQL
CREATE TABLE people (name VARCHAR(50), born_at TIMESTAMP);
INSERT INTO people (name, born_at) VALUES ('Ada Lovelace', '1815-12-10 00:00:00');
-- ERROR 1292 (22007): Incorrect datetime value: '1815-12-10 00:00:00' for column 'born_at' at row 1
- “Adesso” è nel fuso orario del database (sempre UTC in SQLite). Se i tuoi utenti sono in più fusi orari, salva in UTC.
Sintassi alternativa
Incontrerai anche i nomi specifici di ogni database per oggi e adesso:
- MySQL:
CURDATE()eNOW(). Anche PostgreSQL haNOW(). - SQLite:
date('now')edatetime('now'). - SQL Server:
CAST(GETDATE() AS DATE)eGETDATE(). Non haCURRENT_DATE, quindi per la data di oggi serve il cast.
Quando serve inserire una data?
La maggior parte degli inserimenti di date rientra in uno di questi cinque casi, ognuno con il suo strumento.
Registrare una data che conosci già
Compleanni, scadenze e appuntamenti arrivano da una persona o da un modulo. Scrivili come stringhe 'YYYY-MM-DD'.
Registrare la data di oggi o l'ora attuale
Date degli ordini, date di registrazione e log di audit dovrebbero venire dall'orologio del database, non da un valore digitato da qualcuno. Usa CURRENT_DATE o CURRENT_TIMESTAMP (GETDATE() in SQL Server), oppure impostane uno come valore predefinito della colonna.
Salvare anche l'ora oltre alla data
Riunioni, voli e voci di log hanno bisogno anche dell'ora. Usa una colonna DATETIME o TIMESTAMP e scrivi 'YYYY-MM-DD HH:MM:SS'.
Calcolare una data a partire da un'altra
Scadenze, rinnovi e promemoria cadono a un certo intervallo da un'altra data. Lascia che sia il database a fare i calcoli: + INTERVAL in PostgreSQL e MySQL, DATEADD() in SQL Server e date() con un modificatore in SQLite.
Caricare date scritte in un altro formato
Fogli di calcolo ed export CSV contengono spesso date come 06/15/2021. Convertile durante l'inserimento: STR_TO_DATE() in MySQL, TO_DATE() in PostgreSQL e CONVERT() con un numero di stile in SQL Server. SQLite non sa interpretare altri formati, quindi riordina il testo con substr().
Esempi reali di inserimento di date
Aggiungere più date in un'unica istruzione
Un elenco di festività si inserisce con un solo INSERT e una riga di valori per ogni data:
INSERT INTO holidays (holiday_name, holiday_date)
VALUES
('Independence Day', '2026-07-04'),
('Thanksgiving', '2026-11-26'),
('Christmas Day', '2026-12-25');
Inserire la data di oggi con un valore predefinito
Assegna un valore predefinito alla colonna e ogni INSERT che la omette riceverà la data di oggi. MySQL richiede le parentesi attorno a CURRENT_DATE:
CREATE TABLE orders (
order_id INT,
customer_id INT,
order_date DATE DEFAULT (CURRENT_DATE) -- SQL Server: DEFAULT CAST(GETDATE() AS DATE)
);
INSERT INTO orders (order_id, customer_id) VALUES (1, 42);
-- Output (the new row, run on 2026-10-13):
-- order_id | customer_id | order_date
-- ---------+-------------+-----------
-- 1 | 42 | 2026-10-13
Salvare l'orario locale di una riunione in UTC
Qualcuno a New York prenota una riunione per le 9:30 ora locale. Convertila in UTC durante l'inserimento, così gli orari di tutti combaciano:
INSERT INTO meetings (title, starts_at_utc)
VALUES ('Design review', TIMESTAMP '2026-10-20 09:30:00' AT TIME ZONE 'America/New_York' AT TIME ZONE 'UTC');
-- MySQL (once its time zone tables are loaded):
-- CONVERT_TZ('2026-10-20 09:30:00', 'America/New_York', 'UTC')
-- SQL Server:
-- CAST('2026-10-20 09:30:00' AS DATETIME2) AT TIME ZONE 'Eastern Standard Time' AT TIME ZONE 'UTC'
-- Output (the new row):
-- title | starts_at_utc
-- --------------+--------------------
-- Design review | 2026-10-20 13:30:00
SQLite non supporta i fusi orari per nome, quindi fai la conversione nella tua applicazione prima di inserire.
Impostare una data di rinnovo a un mese
Un abbonamento si rinnova un mese dopo l'inizio. Calcola la data di rinnovo direttamente nell'INSERT:
INSERT INTO subscriptions (customer, started_on, renews_on)
VALUES ('Tom', '2026-10-13', DATE '2026-10-13' + INTERVAL '1' MONTH);
-- SQL Server: DATEADD(month, 1, '2026-10-13')
-- SQLite: date('2026-10-13', '+1 month')
-- Output (the new row):
-- customer | started_on | renews_on
-- ---------+------------+-----------
-- Tom | 2026-10-13 | 2026-11-13
Attenzione alla fine del mese in SQLite. Dal 31 gennaio sconfina in marzo, mentre gli altri database si fermano al 28 febbraio:
SELECT date('2026-01-31', '+1 month');
-- Output: 2026-03-03
Importare date in formato giorno/mese/anno
Un fornitore invia fatture con date in stile britannico, 15/06/2021. Indica al database il formato durante l'inserimento:
INSERT INTO invoices (invoice_no, issued_on)
VALUES ('INV-1002', TO_DATE('15/06/2021', 'DD/MM/YYYY'));
-- MySQL: STR_TO_DATE('15/06/2021', '%d/%m/%Y')
-- SQL Server: CONVERT(date, '15/06/2021', 103), where style 103 is dd/mm/yyyy
-- SQLite can't parse dates: rearrange the text with substr()
-- Output (the new row):
-- invoice_no | issued_on
-- -----------+-----------
-- INV-1002 | 2021-06-15
Approfondimenti sull'inserimento di date
Su questo blog:
- Guida al formato delle date in SQL: mostra le date salvate nel formato che ti serve
- Guida a SQL DATEDIFF: conta i giorni, i mesi o gli anni tra due date
- L'istruzione SQL INSERT: la sintassi di INSERT
- Guida a SQL CREATE TABLE: colonne data, valori predefiniti e vincoli
-
Formattare le date in PostgreSQL: i tipi data di PostgreSQL e
TO_CHAR - Importare dati CSV in SQL Server con BULK INSERT: caricare file esportati, date comprese
Documentazione ufficiale:
- PostgreSQL: tipi Date/Time
- MySQL: i tipi DATE, DATETIME e TIMESTAMP
- SQLite: funzioni per data e ora
- SQL Server: tipi di dati e funzioni per data e ora
Beekeeper Studio è una GUI per database gratuita & open source
Il miglior strumento per query & editor SQL che abbia mai usato. Offre tutto ciò che mi serve per gestire il mio database. - ⭐⭐⭐⭐⭐ Mit
Beekeeper Studio è veloce, intuitivo e facile da usare. Beekeeper supporta tantissimi database e funziona alla grande su Windows, Mac e Linux.
Cosa dicono gli utenti di Beekeeper Studio
"Beekeeper Studio ha sostituito completamente il mio vecchio flusso di lavoro SQL. È veloce, intuitivo e rende di nuovo piacevole lavorare con i database."
"Ho provato tante GUI per database, ma Beekeeper trova il perfetto equilibrio tra funzionalità e semplicità. Funziona e basta."