Resumo : neste tutorial, você aprenderá sobre TIMESTAMP
o tipo de dados MySQL e como usá-lo para definir colunas que armazenam dados de carimbo de data/hora.
Introdução ao tipo de dados MySQL TIMESTAMP
O MySQL é um tipo de dadosTIMESTAMP
temporal que contém a combinação de data e hora . O formato de a é fixado em 19 caracteres.TIMESTAMP
YYYY-MM-DD HH:MM:SS
O TIMESTAMP
valor varia de '1970-01-01 00:00:01'
UTC a '2038-01-19 03:14:07'
UTC.
Quando você insere um TIMESTAMP
valor em uma tabela, o MySQL o converte do fuso horário da sua conexão para UTC para armazenamento.
Quando você consulta um TIMESTAMP
valor, o MySQL converte o valor UTC de volta para o fuso horário da sua conexão. Essa conversão não ocorre para outros tipos de dados temporais, como DATETIME
.
Por padrão, o fuso horário da conexão é o fuso horário do servidor MySQL. Você também tem a opção de usar um fuso horário diferente ao se conectar ao servidor MySQL.
Ao recuperar um TIMESTAMP
valor que foi inserido por um cliente em um fuso horário diferente, você receberá um valor diferente daquele armazenado no banco de dados.
No entanto, desde que não altere o fuso horário, você poderá recuperar o TIMESTAMP
valor armazenado originalmente.
Exemplo de fuso horário MySQL TIMESTAMP
Vamos dar um exemplo para ver como o MySQL lida com TIMESTAMP
valores.
Primeiro, criei uma nova tabela chamada t
que possui uma TIMESTAMP
coluna: t1
;
CREATE TABLE t (
ts TIMESTAMP
);
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Segundo, defina o fuso horário da sessão como '+00:00'
UTC usando a SET time_zone
instrução.
SET time_zone='+00:00';
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Terceiro, insira um TIMESTAMP
valor na t
tabela.
INSERT INTO t(ts)
VALUES('2008-01-01 00:00:01');
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Quarto, selecione o TIMESTAMP
valor da t
tabela.
SELECT ts FROM t;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Saída:
+---------------------+
| ts |
+---------------------+
| 2008-01-01 00:00:01 |
+---------------------+
1 row in set (0.00 sec)
Linguagem de código: JavaScript ( javascript )
Quinto, defina o fuso horário da sessão para um fuso horário diferente para observar qual valor recebemos do servidor de banco de dados:
SET time_zone ='+03:00';
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Por fim, consulte os dados da tabela:
SELECT ts FROM t;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Saída:
+---------------------+
| ts |
+---------------------+
| 2008-01-01 03:00:01 |
+---------------------+
1 row in set (0.00 sec)
Linguagem de código: JavaScript ( javascript )
Como você pode ver, recebemos um valor de tempo ajustado ao novo fuso horário, diferente do original.
Inicialização e atualização automática para colunas TIMESTAMP
Considere o seguinte exemplo.
Primeiro, crie uma tabela chamada categories
:
CREATE TABLE categories (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Na categories
tabela, a created_at
coluna é uma TIMESTAMP
coluna cujo valor padrão é definido como CURRENT_TIMESTAMP
.
Segundo, insira uma nova linha na categories
tabela sem especificar o valor da created_at
coluna:
INSERT INTO categories(name)
VALUES ('A');
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
SELECT * FROM categories;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
A saída indica que o MySQL usou o carimbo de data/hora no momento da inserção como valor padrão para a created_at
coluna.
Portanto, uma TIMESTAMP
coluna pode ser inicializada automaticamente com o carimbo de data/hora atual para linhas inseridas que não especificam nenhum valor para a coluna. Esse recurso é chamado de inicialização automática .
Terceiro, adicione uma nova coluna nomeada updated_at
à categories
tabela:
ALTER TABLE categories
ADD COLUMN updated_at
TIMESTAMP DEFAULT CURRENT_TIMESTAMP
ON UPDATE CURRENT_TIMESTAMP;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
O valor padrão da updated_at
coluna é CURRENT_TIMESTAMP
.
E temos uma nova cláusula ON UPDATE CURRENT_TIMESTAMP
que segue a DEFAULT CURRENT_TIMESTAMP
cláusula. Vamos ver seu efeito.
Quarto, insira uma nova linha na categories
tabela.
INSERT INTO categories(name)
VALUES('B');
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Quinto, consulte os dados da categories
tabela:
SELECT * FROM categories;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
O valor padrão da coluna created_at
é o carimbo de data/hora em que a linha foi inserida.
Sexto, atualize o valor na coluna name
do ID da linha 2:
UPDATE categories
SET name = 'B+'
WHERE id = 2;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Sétimo, consulte os dados da categories
tabela para verificar a atualização:
SELECT *
FROM categories
WHERE id = 2;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Observe que o valor na updated_at
coluna mudou para o carimbo de data/hora no momento em que a linha foi atualizada.
A capacidade de uma TIMESTAMP
coluna ser atualizada automaticamente para o carimbo de data/hora atual quando o valor em qualquer outra coluna na linha muda de seu valor atual é chamada de atualização automática .
A coluna updated_at
é chamada de coluna atualizada automaticamente.
Observe que se você executar a UPDATE
instrução para atualizar o mesmo valor da name
coluna, a updated_at
coluna não será atualizada.
UPDATE categories
SET name = 'B+'
WHERE id = 2;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
O valor no updated_at
permanece inalterado.
Para obter mais informações sobre inicialização e atualização automáticas, verifique o tempo de inicialização .
A partir do MySQL 5.6.5, as DATETIME
colunas também possuem inicialização automática e recursos de atualização. Além disso, o DEFAULT_CURRENT_TIMESTAMP
e ON UPDATE CURRENT TIMESTAMP
pode ser aplicado a várias colunas.
Resumo
- Use o
TIMESTAMP
tipo de dados MySQL para representar valores de data e hora. - Defina o
DEFAULT CURRENT_TIMESTAMP
atributo de umaTIMESTAMP
coluna para inicializar automaticamente a coluna com o carimbo de data/hora atual quando uma nova linha for inserida. - Defina o
ON UPDATE CURRENT_TIMESTAMP
atributo para atualizar o carimbo de data/hora sempre que a linha for modificada. - O MySQL armazena os
TIMESTAMP
valores no formato UTC, mas os converte para o fuso horário da sessão atual quando exibido.