1. Cos’è il DATETIME di MySQL?
Il DATETIME di MySQL è un tipo di dato usato per memorizzare data e ora in un unico campo. Gestire valori di data e ora in un database è essenziale per molte applicazioni, come i sistemi di logging e di prenotazione. Il tipo DATETIME memorizza data e ora insieme e supporta un ampio intervallo di valori. Il suo intervallo va da '1000-01-01 00:00:00' a '9999-12-31 23:59:59', e supporta anche i secondi frazionari.
2. Panoramica dei tipi di dato data e ora di MySQL
2.1 Tipi di dato per gestire date e ore
MySQL fornisce i seguenti tipi di dato per lavorare con date e ore:
DATE: Memorizza una data (anno, mese, giorno). L’intervallo è'1000-01-01'a'9999-12-31'.TIME: Memorizza solo l’ora. L’intervallo è'-838:59:59'a'838:59:59'.DATETIME: Memorizza sia data che ora. L’intervallo è'1000-01-01 00:00:00'a'9999-12-31 23:59:59'.TIMESTAMP: Memorizza un timestamp UNIX. L’intervallo è'1970-01-01 00:00:01'a'2038-01-19 03:14:07'.
2.2 Differenze tra DATETIME e TIMESTAMP
DATETIME e TIMESTAMP sono simili, ma presentano le seguenti differenze:
- Fuso orario :
DATETIMEmemorizza un valore fisso che non dipende dai fusi orari. Al contrario,TIMESTAMPviene convertito in UTC al momento della memorizzazione e riconvertito nel fuso orario corrente del server al momento del recupero. Per questo motivo,DATETIMEè adatto a valori data/ora indipendenti dal fuso (ad esempio, orari di eventi), mentreTIMESTAMPè indicato per dati legati al fuso orario del server, come i log. - Formato di memorizzazione :
DATETIMEè memorizzato così com’è, mentreTIMESTAMPè memorizzato come timestamp UNIX. Di conseguenza, i valoriTIMESTAMPsono influenzati dalle impostazioni del fuso orario del server quando rappresentano l’ora.
3. Come usare DATETIME in MySQL
3.1 Creare una colonna DATETIME
Per creare una colonna con il tipo DATETIME, usa la seguente sintassi SQL:
CREATE TABLE sample_table (
event_time DATETIME
);
In questo esempio, viene creata una colonna DATETIME chiamata event_time in una tabella denominata sample_table.
3.2 Inserire valori DATETIME
I valori DATETIME di MySQL possono essere inseriti in vari formati. Il formato base è 'YYYY-MM-DD HH:MM:SS'. Per esempio:
INSERT INTO sample_table (event_time) VALUES ('2024-09-16 14:30:00');
Sono consentiti anche i seguenti formati:
'YY-MM-DD HH:MM:SS': Un formato che utilizza un anno a 2 cifre.'YYYYMMDDHHMMSS': Un formato senza separatori.
Esempio:
INSERT INTO sample_table (event_time) VALUES ('24-09-16 14:30:00');
INSERT INTO sample_table (event_time) VALUES (20240916143000);
I dati inseriti in questi formati verranno memorizzati correttamente. Se l’anno è specificato con due cifre, '70-99' viene convertito in 1970-1999, e '00-69' in 2000-2069.
3.3 Recuperare valori DATETIME
Quando si recuperano valori DATETIME, MySQL li visualizza nel formato predefinito 'YYYY-MM-DD HH:MM:SS'. Per esempio:
SELECT event_time FROM sample_table;
Questa query mostra i valori nella colonna DATETIME usando il formato standard.
4. Lavorare con i secondi frazionari
4.1 Precisione del DATETIME
In MySQL, i valori DATETIME possono includere secondi frazionari. È possibile specificare la precisione usando l’opzione fsp, che consente di memorizzare secondi frazionari da 0 a 6 cifre. Per esempio, per creare una colonna con 3 cifre di secondi frazionari:
CREATE TABLE precise_times (
event_time DATETIME(3)
);
In questo esempio, la colonna event_time può memorizzare secondi frazionari fino a 3 cifre.
4.2 Inserire valori con secondi frazionari
Per inserire un valore DATETIME che includa secondi frazionari, usa il seguente:
INSERT INTO precise_times (event_time) VALUES ('2024-09-16 14:30:00.123');
Questa query memorizza il valore includendo i secondi frazionari in modo accurato. La parte frazionaria viene memorizzata senza essere troncata e la precisione viene preservata al momento del recupero del valore.

5. Best Practices for DATETIME
5.1 Choosing Between DATETIME and TIMESTAMP
- When to use
DATETIME: Per valori di data/ora fissi che non dipendono dai fusi orari (ad esempio, orari di inizio di un evento o date di prenotazione). - When to use
TIMESTAMP: Per dati di data/ora legati al fuso orario del server (ad esempio, timestamp di creazione o aggiornamento di un record).
5.2 Time Zone Management
Poiché DATETIME non memorizza informazioni sul fuso orario, l’applicazione deve gestire i fusi orari separatamente. D’altro canto, TIMESTAMP tiene automaticamente conto del fuso orario del server durante la memorizzazione e il recupero dei valori, rendendolo adatto a sistemi che operano in diversi fusi orari a livello globale.
6. Common Mistakes and How to Avoid Them
6.1 Zero Dates and Invalid Values
In MySQL, se si tenta di inserire un valore DATETIME non valido, potrebbe essere memorizzata una data zero come '0000-00-00 00:00:00'. Poiché questa non è generalmente una data valida, è necessario convalidare i dati di input per impedire l’inserimento di valori non validi. Implementare una validazione che garantisca che l’input rispetti l’intervallo e il formato corretti può aiutare a prevenire la memorizzazione di date zero.
6.2 Misusing Precision
Quando si specifica la precisione dei secondi frazionari, usare una precisione errata può produrre risultati inattesi. Impostare la precisione dei secondi frazionari solo quando necessario e scegliere il valore fsp con attenzione. Per esempio, se la tua applicazione non richiede precisione sub‑secondo, non è necessario aggiungere secondi frazionari a una colonna DATETIME.
7. Summary
In questo articolo abbiamo spiegato in dettaglio il tipo DATETIME di MySQL. DATETIME è un tipo di dato molto utile per memorizzare sia data che ora, ed è adatto quando è necessario conservare valori che non devono essere influenzati dai fusi orari. Comprendendo le differenze tra DATETIME e TIMESTAMP, il funzionamento dei fusi orari e l’uso dei secondi frazionari, è possibile gestire i dati di data/ora in modo più efficace nel proprio database. Inoltre, conoscere gli errori comuni e come evitarli aiuta a mantenere la coerenza e l’affidabilità dei dati.
8. Frequently Asked Questions (FAQ)
Q1: What is the main difference between DATETIME and TIMESTAMP?
DATETIME memorizza una data e ora fisse che non dipendono dai fusi orari. Per esempio, è adatto per memorizzare date di prenotazione o orari di eventi che devono rimanere gli stessi in qualsiasi fuso orario. Al contrario, TIMESTAMP è memorizzato in UTC e convertito nel fuso orario del server al momento del recupero. È adatto per dati di data/ora che dipendono dal fuso orario del server, come i log.
Q2: How can I store fractional seconds with DATETIME?
È possibile impostare la precisione dei secondi frazionari specificando un valore fsp quando si crea la colonna DATETIME. Per esempio, DATETIME(3) memorizza i secondi frazionari fino a 3 cifre. Utilizzando un valore formattato correttamente includendo i secondi frazionari durante l’inserimento, questi verranno memorizzati correttamente.
Q3: Should I use DATETIME or TIMESTAMP?
Dipende dal caso d’uso. Usa DATETIME quando desideri memorizzare una data e ora fisse. Usa TIMESTAMP per dati di data/ora che sono influenzati dal fuso orario del server, come i tempi di creazione o aggiornamento di un record. Poiché TIMESTAMP esegue automaticamente la conversione del fuso orario, è adatto quando il tuo sistema deve operare in diversi fusi orari.

