MariaDB
 sql >> Base de Dados >  >> RDS >> MariaDB

Como TIMESTAMPDIFF() funciona no MariaDB


No MariaDB, TIMESTAMPDIFF() é uma função de data e hora integrada que retorna a diferença entre duas expressões de data ou data e hora.

Sintaxe


A sintaxe fica assim:
TIMESTAMPDIFF(unit,datetime_expr1,datetime_expr2)

Onde unit é um dos seguintes valores:
  • MICROSECOND
  • SECOND
  • MINUTE
  • HOUR
  • DAY
  • WEEK
  • MONTH
  • QUARTER
  • YEAR

As unidades podem opcionalmente ter um prefixo de SQL_TSI_ .

TIMESTAMPDIFF() retorna datetime_expr2 – datetime_expr1 .

Uma expressão pode ser uma data e a outra um datetime. Os valores de data são tratados como tendo uma parte de tempo de 00:00:00 onde necessário.

Exemplo


Segue um exemplo para demonstrar:
SELECT TIMESTAMPDIFF(DAY, '2030-02-01', '2030-03-01');

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

Resultado Negativo


Alternar as datas fornece um resultado negativo:
SELECT TIMESTAMPDIFF(DAY, '2030-03-01', '2030-02-01');

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

Valores de data e hora


Aqui está um exemplo de como passar um valor de data e hora:
SELECT TIMESTAMPDIFF(
    HOUR, 
    '2030-02-01 00:00:00', 
    '2030-02-01 12:30:45'
    ) 
AS Result;

Resultado:
+--------+
| Result |
+--------+
|     12 |
+--------+

Eu especifiquei HOUR , e por isso ignora a parte de minutos e segundos.

Tipos mistos


Aqui está um exemplo de como passar um valor de data e data e hora:
SELECT TIMESTAMPDIFF(
    HOUR, 
    '2030-02-01', 
    '2030-02-01 12:30:45'
    ) 
AS Result;

Resultado:
+--------+
| Result |
+--------+
|     12 |
+--------+

Conforme mencionado, os valores de data são tratados como tendo uma parte de tempo de 00:00:00 .

Adicionando um SQL_TSI_ Prefixo


A unidade pode incluir um SQL_TSI_ prefixo se necessário:
SELECT TIMESTAMPDIFF(
    SQL_TSI_YEAR, 
    '2030-02-01', 
    '2035-02-01'
    )
AS Result;

Resultado:
+--------+
| Result |
+--------+
|      5 |
+--------+

Microsegundos


Aqui está um exemplo que retorna microssegundos:
SELECT TIMESTAMPDIFF(
    MICROSECOND, 
    '2030-02-01 10:30:45.000000',
    '2030-02-01 10:30:45.123456'
    )
AS Result;

Resultado:
+--------+
| Result |
+--------+
| 123456 |
+--------+

Aqui está um em que os microssegundos não são realmente especificados nos valores de data e hora:
SELECT TIMESTAMPDIFF(
    MICROSECOND, 
    '2030-02-01 10:30:45',
    '2030-02-01 12:30:45'
    )
AS Result;

Resultado:
+------------+
| Result     |
+------------+
| 7200000000 |
+------------+

Data atual


Podemos passar NOW() um dos argumentos datetime para comparar a data e hora atuais com outra data:
SELECT 
    NOW(),
    TIMESTAMPDIFF(DAY, NOW(), '2021-03-31') AS Diff;

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

Datas nulas


Se uma das datas for null , o resultado é null :
SELECT TIMESTAMPDIFF(
    YEAR, 
    '2030-02-01',
    NULL
    )
AS Result;

Resultado:
+--------+
| Result |
+--------+
|   NULL |
+--------+

Argumento ausente


Chamando TIMESTAMPDIFF() com o número errado de argumentos, ou sem passar nenhum argumento, resulta em um erro:
SELECT TIMESTAMPDIFF();

Resultado:
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 outro exemplo:
SELECT TIMESTAMPDIFF('2020-12-09');

Resultado:
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