MariaDB
 sql >> Database >  >> RDS >> MariaDB

Come funziona TIMESTAMPDIFF() in MariaDB

In MariaDB, TIMESTAMPDIFF() è una funzione di data e ora incorporata che restituisce la differenza tra due espressioni di data o data e ora.

Sintassi

La sintassi è questa:

TIMESTAMPDIFF(unit,datetime_expr1,datetime_expr2)

Dove unit è uno dei seguenti valori:

  • MICROSECOND
  • SECOND
  • MINUTE
  • HOUR
  • DAY
  • WEEK
  • MONTH
  • QUARTER
  • YEAR

Le unità possono opzionalmente avere un prefisso SQL_TSI_ .

TIMESTAMPDIFF() restituisce datetime_expr2 – datetime_expr1 .

Un'espressione può essere una data e l'altra un datetime. I valori di data vengono trattati come se avessero una parte temporale di 00:00:00 ove necessario.

Esempio

Ecco un esempio da dimostrare:

SELECT TIMESTAMPDIFF(DAY, '2030-02-01', '2030-03-01');

Risultato:

+------------------------------------------------+
| TIMESTAMPDIFF(DAY, '2030-02-01', '2030-03-01') |
+------------------------------------------------+
|                                             28 |
+------------------------------------------------+

Risultato negativo

Cambiare le date fornisce un risultato negativo:

SELECT TIMESTAMPDIFF(DAY, '2030-03-01', '2030-02-01');

Risultato:

+------------------------------------------------+
| TIMESTAMPDIFF(DAY, '2030-03-01', '2030-02-01') |
+------------------------------------------------+
|                                            -28 |
+------------------------------------------------+

Valori di data e ora

Ecco un esempio di passaggio di un valore datetime:

SELECT TIMESTAMPDIFF(
    HOUR, 
    '2030-02-01 00:00:00', 
    '2030-02-01 12:30:45'
    ) 
AS Result;

Risultato:

+--------+
| Result |
+--------+
|     12 |
+--------+

Ho specificato HOUR , quindi ignora la parte dei minuti e dei secondi.

Tipi misti

Ecco un esempio di passaggio di una data e di un valore datetime:

SELECT TIMESTAMPDIFF(
    HOUR, 
    '2030-02-01', 
    '2030-02-01 12:30:45'
    ) 
AS Result;

Risultato:

+--------+
| Result |
+--------+
|     12 |
+--------+

Come accennato, i valori di data vengono trattati come se avessero una parte temporale di 00:00:00 .

Aggiunta di un SQL_TSI_ Prefisso

L'unità può includere un SQL_TSI_ prefisso se richiesto:

SELECT TIMESTAMPDIFF(
    SQL_TSI_YEAR, 
    '2030-02-01', 
    '2035-02-01'
    )
AS Result;

Risultato:

+--------+
| Result |
+--------+
|      5 |
+--------+

Microsecondi

Ecco un esempio che restituisce microsecondi:

SELECT TIMESTAMPDIFF(
    MICROSECOND, 
    '2030-02-01 10:30:45.000000',
    '2030-02-01 10:30:45.123456'
    )
AS Result;

Risultato:

+--------+
| Result |
+--------+
| 123456 |
+--------+

Eccone uno in cui i microsecondi non sono effettivamente specificati nei valori datetime:

SELECT TIMESTAMPDIFF(
    MICROSECOND, 
    '2030-02-01 10:30:45',
    '2030-02-01 12:30:45'
    )
AS Result;

Risultato:

+------------+
| Result     |
+------------+
| 7200000000 |
+------------+

Data attuale

Possiamo passare NOW() uno degli argomenti datetime per confrontare la data e l'ora correnti con un'altra data:

SELECT 
    NOW(),
    TIMESTAMPDIFF(DAY, NOW(), '2021-03-31') AS Diff;

Risultato:

+---------------------+------+
| NOW()               | Diff |
+---------------------+------+
| 2021-05-30 09:29:01 |  -60 |
+---------------------+------+

Date nulle

Se una delle date è null , il risultato è null :

SELECT TIMESTAMPDIFF(
    YEAR, 
    '2030-02-01',
    NULL
    )
AS Result;

Risultato:

+--------+
| Result |
+--------+
|   NULL |
+--------+

Argomento mancante

Chiamando TIMESTAMPDIFF() con il numero errato di argomenti, o senza passare alcun argomento, si verifica un errore:

SELECT TIMESTAMPDIFF();

Risultato:

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ')' at line 1

E un altro esempio:

SELECT TIMESTAMPDIFF('2020-12-09');

Risultato:

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '10, '2020-12-09')' at line 1