- 1 1. Cos’è un TIMESTAMP di MySQL?
- 2 2. Utilizzo base di TIMESTAMP
- 3 3. Lavorare con TIMESTAMP e zone orarie
- 4 4. Il problema dell’anno 2038
- 5 5. Utilizzi pratici di TIMESTAMP
- 6 6. Cose da tenere a mente quando si usa TIMESTAMP
- 7 7. Riepilogo e raccomandazioni
- 8 8. Domande frequenti (FAQ)
- 8.1 Quando dovrei usare TIMESTAMP rispetto a DATETIME?
- 8.2 È vero che TIMESTAMP non funzionerà dopo il 2038?
- 8.3 Come posso consentire valori NULL in una colonna TIMESTAMP?
- 8.4 Cambiare il fuso orario influisce sui dati TIMESTAMP esistenti?
- 8.5 Posso inserire un orario specifico se uso CURRENT_TIMESTAMP?
1. Cos’è un TIMESTAMP di MySQL?
In MySQL, il tipo di dati TIMESTAMP memorizza un punto specifico nel tempo in UTC (Coordinated Universal Time) e regola automaticamente la zona oraria durante l’archiviazione e il recupero. Questo tipo di dati può gestire date e orari che vanno dal 1 gennaio 1970 al 19 gennaio 2038. Quando i dati vengono archiviati, TIMESTAMP utilizza la zona oraria corrente e, al momento del recupero, viene automaticamente convertito in base alla zona oraria del sistema.
Differenza tra TIMESTAMP e DATETIME
Il tipo di dati DATETIME viene spesso confrontato con TIMESTAMP. A differenza di TIMESTAMP, DATETIME memorizza data e ora esattamente come inserite, senza conversioni di zona oraria. Al contrario, TIMESTAMP viene convertito in UTC durante l’archiviazione e poi regolato in base alla zona oraria del sistema al momento del recupero, aiutando a prevenire discrepanze tra zone orarie.
Ad esempio, TIMESTAMP è particolarmente utile quando si migrano sistemi o si gestiscono database su più zone orarie. Nel frattempo, DATETIME supporta un intervallo molto più ampio—dal 1000 al 9999—rendendolo adatto per evitare il problema dell’anno 2038.
Esempio di utilizzo di TIMESTAMP
È possibile creare una tabella con una colonna TIMESTAMP come mostrato di seguito:
CREATE TABLE events (
id INT AUTO_INCREMENT PRIMARY KEY,
event_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
In questo esempio, la colonna event_time memorizza automaticamente l’orario corrente quando un record viene inserito e aggiorna il timestamp ogni volta che il record viene modificato.
2. Utilizzo base di TIMESTAMP
Quando si utilizza TIMESTAMP in MySQL, è importante conoscere i metodi base per inserire e recuperare valori. Di seguito sono riportati diversi esempi di lavoro con TIMESTAMP.
Inserire una data e ora specifica
Quando si inseriscono dati in una colonna TIMESTAMP, di solito si fornisce la data e l’ora come stringa nel formato YYYY-MM-DD hh:mm:ss.
INSERT INTO events (event_time) VALUES ('2023-10-01 12:30:00');
Questa istruzione SQL inserisce il 1 ottobre 2023 alle 12:30 nel colonna event_time.
Inserire l’orario corrente
Utilizzando la funzione NOW() di MySQL, è possibile inserire facilmente la data e l’ora corrente. Questa funzione restituisce l’orario di sistema corrente in base alla zona oraria configurata.
INSERT INTO events (event_time) VALUES (NOW());
In questo caso, la query inserisce il timestamp corrente esatto nel momento in cui viene eseguita l’SQL.
Abilitare aggiornamenti automatici
Aggiungendo ON UPDATE CURRENT_TIMESTAMP a una colonna TIMESTAMP, MySQL aggiorna automaticamente il valore della colonna ogni volta che il record viene modificato.
CREATE TABLE orders (
id INT AUTO_INCREMENT PRIMARY KEY,
order_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
Qui, order_time memorizza il timestamp corrente quando il record viene creato per la prima volta e lo aggiorna ogni volta che la riga viene modificata.
3. Lavorare con TIMESTAMP e zone orarie
Una delle principali caratteristiche di TIMESTAMP è la gestione delle zone orarie. I dati archiviati vengono sempre convertiti in UTC e, al momento del recupero, vengono convertiti in base alla zona oraria del sistema.
Controllare le impostazioni della zona oraria
In MySQL, le zone orarie possono essere impostate per server o sessione. È possibile controllare l’impostazione corrente utilizzando:
SHOW VARIABLES LIKE 'time_zone';
Per cambiare la zona oraria, è possibile utilizzare:
SET time_zone = '+09:00';
TIMESTAMP vs. DATETIME nelle zone orarie
DATETIME ignora le zone orarie e memorizza i valori esattamente come inseriti, mentre TIMESTAMP converte in UTC. Questo rende TIMESTAMP più adatto per sistemi che operano su più zone orarie.
4. Il problema dell’anno 2038
Il problema dell’anno 2038 deriva dalle limitazioni dei sistemi a 32 bit con TIMESTAMP. Poiché conta i secondi dal 1 gennaio 1970, sovraccarica dopo il 19 gennaio 2038, alle 03:14:07 UTC.
Come evitare il problema del 2038
Per evitarlo, utilizzare un sistema a 64 bit o passare a DATETIME, che supporta gli anni dal 1000 al 9999. Gli aggiornamenti del sistema a 64 bit eliminano completamente il problema.
5. Utilizzi pratici di TIMESTAMP
Il TIMESTAMP di MySQL non serve solo a memorizzare date e orari, ma anche a registrare automaticamente i tempi di creazione e aggiornamento. Alcuni casi d’uso includono:
Inserimento automatico dell’ora corrente
CREATE TABLE orders (
id INT AUTO_INCREMENT PRIMARY KEY,
order_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
Aggiornamento automatico dei timestamp
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50),
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
Utilizzo di più colonne TIMESTAMP
Sebbene sia possibile avere più colonne TIMESTAMP in una tabella, solo una può avere CURRENT_TIMESTAMP come valore predefinito. Per più campi data gestiti automaticamente, potresti dover usare DATETIME o impostare esplicitamente i valori.
CREATE TABLE posts (
id INT AUTO_INCREMENT PRIMARY KEY,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
6. Cose da tenere a mente quando si usa TIMESTAMP
Vincoli NULL e valori predefiniti
Le colonne TIMESTAMP sono NOT NULL per impostazione predefinita. Per consentire valori NULL, specifica DEFAULT NULL.
CREATE TABLE logs (
id INT AUTO_INCREMENT PRIMARY KEY,
log_time TIMESTAMP DEFAULT NULL
);
Il problema del 0000-00-00 00:00:00
Le versioni più vecchie di MySQL possono consentire 0000-00-00 00:00:00 come timestamp non valido. Tuttavia, ciò può causare problemi di integrità ed è sconsigliato. Invece, usa NULL o un valore predefinito valido.
Impatto del fuso orario di sistema
Poiché TIMESTAMP memorizza sempre in UTC, la migrazione di database su server con fusi orari diversi può influire sui risultati. Assicurati sempre di una gestione coerente dei fusi orari.
7. Riepilogo e raccomandazioni
TIMESTAMP è uno strumento potente di MySQL per gestire date e orari in efficiente. La sua auto‑conversione con i fusi orari e le funzionalità di aggiornamento automatico lo rendono molto comodo. Tuttavia, gli sviluppatori devono comprendere le sue limitazioni, come il problema dell’anno 2038 e la gestione dei NULL.
- Usa
TIMESTAMPquando sono richiesti aggiornamenti automatici. - Scegli
TIMESTAMPper sistemi sensibili al fuso orario. - Usa
DATETIMEper dati a lungo termine oltre il 2038 o quando è necessaria una coerenza assoluta.
8. Domande frequenti (FAQ)
Quando dovrei usare TIMESTAMP rispetto a DATETIME?
Usa TIMESTAMP per sistemi che necessitano di aggiustamenti del fuso orario e della registrazione automatica dei tempi di creazione/aggiornamento. Usa DATETIME quando desideri una memorizzazione coerente non influenzata dai fusi orari.
È vero che TIMESTAMP non funzionerà dopo il 2038?
Sì, sui sistemi a 32 bit, TIMESTAMP va in overflow dopo il 19 gennaio 2038. Per evitare problemi, usa DATETIME o migra a un sistema a 64 bit.
Come posso consentire valori NULL in una colonna TIMESTAMP?
Imposta esplicitamente DEFAULT NULL quando crei la colonna:
CREATE TABLE logs (
id INT AUTO_INCREMENT PRIMARY KEY,
log_time TIMESTAMP DEFAULT NULL
);
Cambiare il fuso orario influisce sui dati TIMESTAMP esistenti?
I dati memorizzati rimangono in UTC, ma il recupero si adatta alla nuova impostazione del fuso orario, modificando il modo in cui gli orari vengono visualizzati. Mantieni i fusi orari di sistema coerenti per evitare confusioni.
Posso inserire un orario specifico se uso CURRENT_TIMESTAMP?
Sì. Sebbene CURRENT_TIMESTAMP inserisca l’ora corrente del sistema, puoi comunque inserire manualmente valori specifici:
INSERT INTO events (event_time) VALUES ('2023-10-01 12:30:00');


