Tipo de dados MySQL TIME

Resumo : neste tutorial, você aprenderá sobre o TIMEtipo de dados MySQL e como usar funções temporais para manipular dados de tempo de maneira eficaz.

Introdução ao tipo de dados MySQL TIME

O MySQL usa o 'HH:MM:SS'formato para consultar e exibir um valor de tempo que representa uma hora do dia, que está dentro de 24 horas. 

Para representar um intervalo de tempo entre dois eventos, o MySQL usa o 'HHH:MM:SS'formato maior que 24 horas.

Para definir uma TIMEcoluna, você usa a seguinte sintaxe:

column_name TIME;Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Por exemplo, o trecho a seguir define uma coluna nomeada start_atcom TIMEtipo de dados.

start_at TIME;Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Um TIMEvalor varia de -838:59:59a 838:59:59. Além disso, um TIMEvalor pode ter uma parte fracionária de segundos com precisão de até microssegundos (6 dígitos). 

Para definir uma coluna cujo tipo de dados é TIMEcom uma parte de precisão fracionária de segundo, use a seguinte sintaxe:

column_name TIME(N);Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Nesta sintaxe, Né um número inteiro que representa a parte fracionária, que tem até 6 dígitos.

O seguinte define uma coluna com TIMEtipo de dados incluindo 3 dígitos de segundos fracionários.

begin_at TIME(3);Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Um TIMEvalor leva 3 bytes para armazenamento. Se um TIMEvalor incluir precisão de segundo fracionário, serão necessários bytes adicionais com base no número de dígitos da precisão de segundo fracionário.

A tabela a seguir ilustra o armazenamento necessário para precisão de frações de segundo.

Precisão de segundo fracionário Armazenamento (BYTES)
0 0
1, 2 1
3, 4 2
5, 6 3

Por exemplo, TIMEe TIME(0)ocupa 3 bytes. TIME(1)e TIME(2)ocupa 4 bytes (3 + 1); TIME(3)e TIME(6)pegue 5 e 6 bytes.

Exemplo de tipo de dados MySQL TIME

Vejamos um exemplo de uso do TIMEtipo de dados para colunas em uma tabela.

Primeiro, crie uma nova tabela chamada tests que consiste em quatro colunas: id, name, start_ate end_at. Os tipos de dados das colunas start_ate end_atsão TIME:

CREATE TABLE tests (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(255) NOT NULL,
    start_at TIME,
    end_at TIME
);Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Segundo, insira uma linha na teststabela.

INSERT INTO tests(name,start_at,end_at)
VALUES('Test 1', '08:00:00','10:00:00');Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Terceiro, consulte os dados da teststabela.

SELECT 
    name, start_at, end_at
FROM
    tests;Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Saída:

+--------+----------+----------+
| name   | start_at | end_at   |
+--------+----------+----------+
| Test 1 | 08:00:00 | 10:00:00 |
+--------+----------+----------+
1 row in set (0.00 sec)Linguagem de código:  JavaScript  ( javascript )

Observe que usamos 'HH:MM:SS'como valor de tempo literal na INSERTinstrução. Vamos examinar todos os literais de tempo válidos que o MySQL pode reconhecer.

Literais TIME do MySQL

O MySQL reconhece vários formatos de hora além do 'HH:MM:SS'formato que mencionamos anteriormente.

MySQL permite que você use o 'HHMMSS'formato sem delimitador (:) para representar o valor do tempo. Por exemplo, '08:30:00'e '10:15:00'pode ser reescrito como '083000'e '101500'.

INSERT INTO tests(name,start_at,end_at)
VALUES('Test 2','083000','101500');Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

A tabela de testes terá as seguintes linhas:

+--------+----------+----------+
| name   | start_at | end_at   |
+--------+----------+----------+
| Test 1 | 08:00:00 | 10:00:00 |
| Test 2 | 08:30:00 | 10:15:00 |
+--------+----------+----------+
2 rows in set (0.00 sec)Linguagem de código:  JavaScript  ( javascript )

No entanto, 108000não é um valor de tempo válido porque 80não representa o minuto correto. Neste caso, o MySQL irá gerar um erro se você tentar inserir um valor de tempo inválido em uma tabela.

INSERT INTO tests(name,start_at,end_at)
VALUES('Test invalid','083000','108000');Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

O MySQL emitiu a seguinte mensagem de erro após executar a instrução acima.

Error Code: 1292. Incorrect time value: '108000' for column 'end_at' at row 1Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Além do formato string, o MySQL aceita HHMMSScomo um número que representa um valor de tempo. Você também pode usar SS, MMSS. Por exemplo, em vez de usar '082000', você pode usar 082000o seguinte:

INSERT INTO tests(name,start_at,end_at)
VALUES('Test 3',082000,102000);Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )
+----+--------+----------+----------+
| id | name   | start_at | end_at   |
+----+--------+----------+----------+
|  1 | Test 1 | 08:00:00 | 10:00:00 |
|  2 | Test 2 | 08:30:00 | 10:15:00 |
|  3 | Test 3 | 08:20:00 | 10:20:00 |
+----+--------+----------+----------+
3 rows in set (0.00 sec)Linguagem de código:  JavaScript  ( javascript )

Para o intervalo de tempo, você pode usar o 'D HH:MM:SS'formato onde Drepresenta dias com intervalo de 0 a 34. Uma sintaxe mais flexível é 'HH:MM', 'D HH:MM', 'D HH', ou 'SS'.

Se você usar o delimitador :, poderá usar um dígito para representar horas, minutos ou segundos. Por exemplo, 9:5:0pode ser usado em vez de '09:05:00'.

INSERT INTO tests(name,start_at,end_at)
VALUES('Test 4','9:5:0',100500);Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )
+----+--------+----------+----------+
| id | name   | start_at | end_at   |
+----+--------+----------+----------+
|  1 | Test 1 | 08:00:00 | 10:00:00 |
|  2 | Test 2 | 08:30:00 | 10:15:00 |
|  3 | Test 3 | 08:20:00 | 10:20:00 |
|  4 | Test 4 | 09:05:00 | 10:05:00 |
+----+--------+----------+----------+
4 rows in set (0.00 sec)Linguagem de código:  JavaScript  ( javascript )

Funções úteis do MySQL TIME

MySQL fornece diversas funções temporais úteis para manipulação TIMEde dados.

1) Obtendo a hora atual

Para obter a hora atual do servidor de banco de dados, você usa a CURRENT_TIMEfunção. A CURRENT_TIMEfunção retorna o valor da hora atual como uma string ( 'HH:MM:SS') ou um valor numérico ( HHMMSS) dependendo do contexto onde a função é usada.

As declarações a seguir ilustram a CURRENT_TIMEfunção em contextos de string e numérico:

SELECT 
    CURRENT_TIME() AS string_now,
    CURRENT_TIME() + 0 AS numeric_now;Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )
Função MySQL CURRENT_TIME

2) Adicionando e subtraindo tempo de um valor TIME

Para adicionar um TIMEvalor a outro TIMEvalor, você usa a ADDTIMEfunção. Para subtrair um TIMEvalor de outro TIMEvalor, você usa a  SUBTIMEfunção.

A instrução a seguir adiciona e subtrai 2 horas e 30 minutos da hora atual.

SELECT 
    CURRENT_TIME(),
    ADDTIME(CURRENT_TIME(), 023000),	
    SUBTIME(CURRENT_TIME(), 023000);Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )
+----------------+---------------------------------+---------------------------------+
| CURRENT_TIME() | ADDTIME(CURRENT_TIME(), 023000) | SUBTIME(CURRENT_TIME(), 023000) |
+----------------+---------------------------------+---------------------------------+
| 16:23:31       | 18:53:31                        | 13:53:31                        |
+----------------+---------------------------------+---------------------------------+
1 row in set (0.00 sec)Linguagem de código:  JavaScript  ( javascript )

Além disso, você pode usar a TIMEDIFF()função para obter a diferença entre dois TIMEvalores.

SELECT 
    TIMEDIFF(end_at, start_at)
FROM
    tests;Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

3) Formatando valores TIME do MySQL

Embora o MySQL use 'HH:MM:SS'ao recuperar e exibir um TIME valor, você pode exibir o  TIMEvalor da maneira que preferir usando a  TIME_FORMATfunção.

A TIME_FORMATfunção é semelhante à DATE_FORMATfunção, exceto que a TIME_FORMATfunção é usada apenas para formatar um TIMEvalor.

Veja o exemplo a seguir.

SELECT 
    name,
    TIME_FORMAT(start_at, '%h:%i %p') start_at,
    TIME_FORMAT(end_at, '%h:%i %p') end_at
FROM
    tests;Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Saída:

+--------+----------+----------+
| name   | start_at | end_at   |
+--------+----------+----------+
| Test 1 | 08:00 AM | 10:00 AM |
| Test 2 | 08:30 AM | 10:15 AM |
| Test 3 | 08:20 AM | 10:20 AM |
| Test 4 | 09:05 AM | 10:05 AM |
+--------+----------+----------+
4 rows in set (0.00 sec)Linguagem de código:  JavaScript  ( javascript )

Na sequência de formato de hora acima:

  •  %hsignifica horas de dois dígitos de 0 a 12.
  •  %i significa minutos de dois dígitos de 0 a 60.
  •  %psignifica AM ou PM.

4) Extraindo hora, minuto e segundo de um valor TIME

Para extrair a hora, o minuto e o segundo de um TIMEvalor, você usa as funções HOUR, MINUTEe SECONDda seguinte forma:

SELECT 
  start_at, 
  hour(start_at) hour, 
  minute(start_at) minute, 
  second(start_at) second 
FROM 
  tests;

Saída:

+----------+------+--------+--------+
| start_at | hour | minute | second |
+----------+------+--------+--------+
| 08:00:00 |    8 |      0 |      0 |
| 08:30:00 |    8 |     30 |      0 |
| 08:20:00 |    8 |     20 |      0 |
| 09:05:00 |    9 |      5 |      0 |
+----------+------+--------+--------+
4 rows in set (0.00 sec)Linguagem de código:  JavaScript  ( javascript )

5) Obtendo o valor do horário UTC

Para obter a hora UTC, você usa UTC_TIMEa função da seguinte forma:

SELECT 
   CURRENT_TIME(), 
   UTC_TIME();Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Saída:

+----------------+------------+
| CURRENT_TIME() | UTC_TIME() |
+----------------+------------+
| 16:24:43       | 09:24:43   |
+----------------+------------+
1 row in set (0.00 sec)Linguagem de código:  JavaScript  ( javascript )

Neste tutorial, abordamos muito sobre TIMEo tipo de dados MySQL e algumas funções temporais comumente usadas para manipulação TIMEde valores.

Deixe um comentário

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