Função MySQL SYSDATE

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 fspque 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 fspargumento, 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 testse 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 tcoluna 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 EXPLAINdeclaração.

EXPLAIN SELECT 
    id, t
FROM
    tests
WHERE
    t >= SYSDATE() - INTERVAL 1 DAY;
Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )
MySQL SYSDATE - função SYSDATE

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 EXPLAINinstrução abaixo:

EXPLAIN SELECT 
    id, 
    t
FROM
    tests
WHERE
    t >= NOW() - INTERVAL 1 DAY;
Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )
MySQL SYSDATE - função AGORA

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.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *