Resumo : neste tutorial, você aprenderá sobre a SYSDATE()
função MySQL e suas advertências.
Introdução à função MySQL SYSDATE()
A função retorna a data e horaSYSDATE()
atuais em que foi executada. Se você usar a função no contexto de string, o valor de retorno no formato. No entanto, se você usar a função em um contexto numérico, ela retornará um valor no formato.'YYYY-MM-DD HH:MM:SS'
YYYYMMDDHHMMSS
Aqui está a sintaxe básica da SYSDATE()
função:
SYSDATE(fsp);
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
A SYSDATE()
função aceita um argumento opcional fsp
que determina se o resultado deve incluir uma precisão de segundos fracionários que varia de 0 a 6.
Veja o exemplo a seguir:
SELECT SYSDATE();
Saída:
+---------------------+
| SYSDATE() |
+---------------------+
| 2017-07-13 17:42:37 |
+---------------------+
1 row in set (0.00 sec)
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Se você passar o fsp
argumento, o resultado incluirá a precisão dos segundos fracionários, conforme mostrado no exemplo a seguir:
SELECT SYSDATE(3);
Saída:
+-------------------------+
| SYSDATE(3) |
+-------------------------+
| 2017-07-13 17:42:55.875 |
+-------------------------+
1 row in set (0.00 sec)
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
SYSDATE x AGORA
O exemplo a seguir usa as funções SYSDATE()
e NOW()
na mesma consulta:
SELECT
SYSDATE(),
NOW();
Saída:
+---------------------+---------------------+
| SYSDATE() | NOW() |
+---------------------+---------------------+
| 2017-07-13 17:46:30 | 2017-07-13 17:46:30 |
+---------------------+---------------------+
1 row in set (0.00 sec)
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Parece que ambas SYSDATE()
as NOW()
funções retornam o mesmo valor, que é a data e hora atuais em que é executada.
No entanto, a SYSDATE()
função na verdade retorna o horário em que é executada, enquanto a NOW()
função retorna um horário constante em que a instrução começou a ser executada. Por exemplo:
SELECT
NOW(),
SLEEP(5),
NOW();
Saída:
+---------------------+----------+---------------------+
| NOW() | SLEEP(5) | NOW() |
+---------------------+----------+---------------------+
| 2017-07-13 17:49:18 | 0 | 2017-07-13 17:49:18 |
+---------------------+----------+---------------------+
1 row in set (5.00 sec)
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Neste exemplo, usamos a SLEEP()
função para pausar a consulta por 5 segundos. Dentro da mesma instrução, a NOW()
função sempre retorna uma constante que é o momento em que a instrução começa.
Vamos mudar a NOW()
função para SYSDATE()
função:
SELECT
SYSDATE(),
SLEEP(5),
SYSDATE();
Saída:
+---------------------+----------+---------------------+
| SYSDATE() | SLEEP(5) | SYSDATE() |
+---------------------+----------+---------------------+
| 2017-07-13 17:50:57 | 0 | 2017-07-13 17:51:02 |
+---------------------+----------+---------------------+
1 row in set (5.00 sec)
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Dentro da mesma instrução, SYSDATE()
a função retorna diferentes valores de tempo que refletem o horário em que a SYSDATE()
função foi executada.
Como a SYSDATE()
função é não determinística, os índices não podem ser utilizados para avaliar expressões que se referem a ela.
Para demonstrar isso, criaremos uma tabela chamada tests
e inseriremos alguns dados nesta tabela.
CREATE TABLE tests (
id INT AUTO_INCREMENT PRIMARY KEY,
t DATETIME UNIQUE
);
INSERT INTO tests(t)
WITH RECURSIVE times(t) AS
(
SELECT now() - interval 1 YEAR t
UNION ALL
SELECT t + interval 1 hour
FROM times
WHERE t < now()
)
SELECT t
FROM times;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Observe que usamos um CTE recursivo para gerar séries temporais. O CTE está disponível desde o MySQL 8.0
Como a t
coluna possui um índice exclusivo , a consulta a seguir deve ser executada rapidamente:
SELECT
id,
t
FROM
tests
WHERE
t >= SYSDATE() - INTERVAL 1 DAY;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
No entanto, demorou 15ms para ser concluído. Vamos ver os detalhes usando a EXPLAIN
declaração.
EXPLAIN SELECT
id, t
FROM
tests
WHERE
t >= SYSDATE() - INTERVAL 1 DAY;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Acontece que o MySQL teve que varrer todas as linhas da tabela para obter os dados. O índice não pôde ser utilizado.
Se você alterar a função SYSDATE()
to NOW()
na consulta:
SELECT
id,
t
FROM
tests
WHERE
t >= NOW() - INTERVAL 1 DAY;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Com a NOW()
função, o índice foi utilizado para consulta de dados conforme demonstrado no resultado da EXPLAIN
instrução abaixo:
EXPLAIN SELECT
id,
t
FROM
tests
WHERE
t >= NOW() - INTERVAL 1 DAY;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Observe que o MySQL oferece a --sysdate-is-now
opção que pode fazer com que a SYSDATE()
função se comporte da mesma forma que a NOW()
função.
Neste tutorial, você aprendeu sobre a SYSDATE()
função MySQL e os motivos pelos quais você deve considerar usá-la.