Guida al tempo corrente in MySQL: NOW(), CURRENT_TIMESTAMP, DATE_FORMAT, impostazioni del fuso orario e migliori pratiche

目次

1. Introduzione

Quando è necessario gestire l’ora corrente in MySQL?

In MySQL, recuperare l’ora corrente è richiesto in molti scenari diversi. Per esempio, i seguenti casi d’uso sono comuni:

  • Inserimento automatico di un timestamp durante la registrazione dei dati
  • Ad esempio, registrare la data e l’ora di creazione quando si salvano dati di ordini o di log.
  • Filtrare i dati in base all’ora corrente
  • Ad esempio, recuperare solo i dati degli ultimi 7 giorni o cercare record con date future.
  • Formattare date e ore per la visualizzazione
  • Formattare i valori di data e ora per una migliore leggibilità durante la generazione di report.
  • Gestire la scadenza dei dati usando l’ora corrente
  • Ad esempio, determinare se un coupon è ancora valido confrontandolo con l’ora corrente.

Come potete vedere, recuperare e manipolare correttamente l’ora corrente in MySQL è una competenza importante nella gestione dei database.

Cosa imparerai in questo articolo

Questo articolo spiega in dettaglio i seguenti argomenti:

  • Come recuperare l’ora corrente in MySQL (NOW(), CURRENT_TIMESTAMP, ecc.)
  • Come modificare i formati di data e ora (usando DATE_FORMAT())
  • Calcoli di data e ora usando l’ora corrente (usando INTERVAL)
  • Come cambiare il fuso orario (SET SESSION time_zone)
  • Usare l’ora corrente come valore predefinito (CURRENT_TIMESTAMP)
  • Errori comuni e come risolverli (FAQ)

Dalle basi all’uso avanzato della gestione del “tempo corrente” in MySQL, questa guida fornisce esempi SQL pratici. Assicurati di leggere fino alla fine.

2. Come recuperare l’ora corrente in MySQL

Elenco delle funzioni per recuperare l’ora corrente in MySQL

MySQL fornisce diverse funzioni per recuperare l’ora corrente. Comprendi le differenze e usale in modo appropriato.

FunctionReturnsExample
NOW()Current date and time (date + time)SELECT NOW();2025-02-11 16:00:00
CURRENT_TIMESTAMPSame as NOW() (SQL standard)SELECT CURRENT_TIMESTAMP;
CURDATE()Current date onlySELECT CURDATE();2025-02-11
CURTIME()Current time onlySELECT CURTIME();16:00:00

Funzione NOW()

NOW() è la funzione più comunemente usata in MySQL per recuperare l’ora corrente.
Restituisce sia la data che l’ora.

SELECT NOW();

Esempio di output:

2025-02-11 16:00:00
  • NOW() restituisce l’ora corrente del sistema.
  • Poiché è influenzata dal fuso orario, l’ora visualizzata può variare a seconda dell’ambiente (spiegato in dettaglio nella sezione “Impostazioni del fuso orario”).

Come usare CURRENT_TIMESTAMP

CURRENT_TIMESTAMP si comporta quasi allo stesso modo di NOW(). È conforme allo standard SQL e può essere usato anche in altri database.

SELECT CURRENT_TIMESTAMP;

Esempio di output:

2025-02-11 16:00:00

Ottenere solo la data con CURDATE()

CURDATE() viene usata quando si desidera recuperare solo la data corrente (anno, mese, giorno).

SELECT CURDATE();

Esempio di output:

2025-02-11

Ottenere solo l’ora con CURTIME()

Se vuoi recuperare solo l’ora corrente (ora, minuti, secondi), usa CURTIME().

SELECT CURTIME();

Esempio di output:

16:00:00

Quale funzione dovresti usare?

PurposeRecommended Function
Retrieve both date and timeNOW() or CURRENT_TIMESTAMP
Retrieve date onlyCURDATE()
Retrieve time onlyCURTIME()

3. Come formattare l’ora corrente in MySQL

Formattazione personalizzata con DATE_FORMAT()

Sintassi di base di DATE_FORMAT()

In MySQL, è possibile usare la funzione DATE_FORMAT() per modificare liberamente il formato di date e ore.

SELECT DATE_FORMAT(datetime_value, 'format_specifiers');

Esempio: Converti NOW() nel formato YYYY/MM/DD HH:MM

SELECT DATE_FORMAT(NOW(), '%Y/%m/%d %H:%i');

Output:

2025/02/11 16:45

Elenco dei formati di specificatori comuni

SpecifierMeaningExample (2025-02-11 16:45:30)
%Y4-digit year2025
%m2-digit month (01-12)02
%d2-digit day (01-31)11
%HHour (00-23, 24-hour format)16
%iMinutes (00-59)45
%sSeconds (00-59)30

Estrarre solo la parte dell’ora con TIME()

Se vuoi estrarre solo la parte dell’ora dal datetime restituito da NOW(), usa la funzione TIME().

SELECT TIME(NOW());

Output:

16:45:30

Estrarre parti con YEAR(), MONTH() e DAY()

Per estrarre solo parti specifiche, usa le seguenti funzioni.

FunctionReturnsSQLOutput Example (2025-02-11 16:45:30)
YEAR()YearSELECT YEAR(NOW());2025
MONTH()MonthSELECT MONTH(NOW());2
DAY()DaySELECT DAY(NOW());11

Esempi pratici di formattazione

Il seguente SQL è utile per provare vari formati in pratica.

SELECT 
    NOW() AS 'Original datetime',
    DATE_FORMAT(NOW(), '%Y/%m/%d') AS 'YYYY/MM/DD format',
    DATE_FORMAT(NOW(), '%H:%i:%s') AS 'HH:MM:SS',
    TIME(NOW()) AS 'Time only',
    YEAR(NOW()) AS 'Year',
    MONTH(NOW()) AS 'Month',
    DAY(NOW()) AS 'Day';

4. Calcoli di Data/Ora Utilizzando l’Ora Corrente in MySQL

Aggiungere/Sottrarre con INTERVAL

Sintassi di Base

SELECT current_datetime + INTERVAL number unit;
SELECT current_datetime - INTERVAL number unit;

Aggiungere Tempo Basato su NOW()

Ad esempio, per recuperare la data/ora “una settimana dopo”:

SELECT NOW() + INTERVAL 7 DAY;

Esempio di output:

2025-02-18 16:30:00
UnitMeaningExample
SECONDSecondsNOW() + INTERVAL 10 SECOND
MINUTEMinutesNOW() + INTERVAL 5 MINUTE
HOURHoursNOW() + INTERVAL 2 HOUR
DAYDaysNOW() + INTERVAL 10 DAY
MONTHMonthsNOW() + INTERVAL 3 MONTH

Calcolare la Differenza tra Due Date con DATEDIFF()

SELECT DATEDIFF(NOW(), '2025-01-01');

Esempio di output:

30

Filtrare per Intervallo di Date con BETWEEN

SELECT * FROM orders
WHERE created_at BETWEEN '2025-02-01 00:00:00' AND '2025-02-28 23:59:59';

5. Impostazioni del Fuso Orario MySQL

Verificare il Fuso Orario Corrente

SHOW VARIABLES LIKE '%time_zone%';

Esempio di output:

+------------------+----------------+
| Variable_name    | Value          |
+------------------+----------------+
| system_time_zone | UTC            |
| time_zone        | SYSTEM         |
+------------------+----------------+

Cambiare il Fuso Orario per Sessione

SET SESSION time_zone = 'Asia/Tokyo';

Cambiare il Fuso Orario Predefinito del Server

Aggiungere quanto segue al file di configurazione (my.cnf):

[mysqld]
default_time_zone = 'Asia/Tokyo'

Ottenere l’Ora UTC con UTC_TIMESTAMP

SELECT UTC_TIMESTAMP();

Convertire in Ora Locale con CONVERT_TZ()

SELECT CONVERT_TZ(UTC_TIMESTAMP(), 'UTC', 'Asia/Tokyo');

6. Come Impostare l’Ora Corrente come Valore Predefinito in MySQL

Impostare CURRENT_TIMESTAMP come Valore Predefinito

CREATE TABLE logs (
    id INT AUTO_INCREMENT PRIMARY KEY,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

Aggiornamenti Automatici con ON UPDATE CURRENT_TIMESTAMP

CREATE TABLE logs (
    id INT AUTO_INCREMENT PRIMARY KEY,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

Differenza tra DATETIME e TIMESTAMP

TypeAffected by Time ZoneCan Set CURRENT_TIMESTAMP as Default
TIMESTAMPYesYes
DATETIMENoNo

Perché Non Puoi Usare NOW() come Valore Predefinito e la Soluzione

ERROR 1067 (42000): Invalid default value for 'created_at'

Soluzione:

CREATE TRIGGER set_created_at
BEFORE INSERT ON logs
FOR EACH ROW
SET NEW.created_at = NOW();

7. Errori MySQL Comuni e Soluzioni (FAQ)

Impossibile Usare NOW() come Valore Predefinito

Esempio di Errore

CREATE TABLE logs (
    created_at DATETIME DEFAULT NOW()
);
ERROR 1067 (42000): Invalid default value for 'created_at'

Soluzione

CREATE TABLE logs (
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

L’Ora di CURRENT_TIMESTAMP è Errata

SHOW VARIABLES LIKE 'time_zone';

Soluzione

SET SESSION time_zone = 'Asia/Tokyo';

Il Risultato di NOW() è Sfasato di Un’Ora

SHOW VARIABLES LIKE 'system_time_zone';

Soluzione

SET GLOBAL time_zone = 'Asia/Tokyo';

Il Filtraggio di Intervallo con BETWEEN Non Funziona Come Previsto

SELECT * FROM orders
WHERE created_at BETWEEN '2025-02-01' AND '2025-02-28';

Soluzione

SELECT * FROM orders
WHERE created_at BETWEEN '2025-02-01 00:00:00' AND '2025-02-28 23:59:59';

8. Buone Pratiche per Gestire l’Ora Corrente in MySQL

Quando Usare NOW() vs CURRENT_TIMESTAMP

Use CaseRecommended
Retrieve the current time in a SELECT statementNOW()
Automatically set the current time during INSERTCURRENT_TIMESTAMP
Set as the default value of a TIMESTAMP columnCURRENT_TIMESTAMP

Quando Usare TIMESTAMP vs DATETIME

Data TypeAffected by Time ZoneStorage Size
TIMESTAMPYes4 bytes
DATETIMENo8 bytes

Memorizzare in UTC e Convertire in Ora Locale

SELECT CONVERT_TZ(event_time, 'UTC', 'Asia/Tokyo');

Usa >= e < invece di BETWEEN

SELECT * FROM orders
WHERE created_at >= '2025-02-01 00:00:00' 
AND created_at < '2025-03-01 00:00:00';

Standardizza l’uso di INTERVAL

SELECT NOW() + INTERVAL 1 DAY;

Pulisci correttamente i dati vecchi

DELETE FROM logs WHERE created_at < NOW() - INTERVAL 1 YEAR LIMIT 1000;