Os tipos DATETIME
, DATE
,
e TIMESTAMP
são relacionados. Esta seção
descreve suas características, como eles se assemelham ou
como se diferem.
O tipo DATETIME
é usado quando você
precisa de valores que contém informações sobre data e a a
hora. MySQL recupera e mostra valores
DATETIME
no formato 'YYYY-MM-DD
HH:MM:SS'
. A faixa suportada é de
'1000-01-01 00:00:00'
até
'9999-12-31 23:59:59'
. (``Suportada''
significa que embora valores anteriores possam funcionar, não
há nenhura garantia de disto.)
O tipo DATA
é usado quando se necessita
apenas do valor da data, sem a parte da hora. MySQL recupera e
mostra valores do tipo DATA
no formato
'YYYY-MM-DD'
. A faixa suportada é de
'1000-01-01'
até
'9999-12-31'
.
A coluna do tipo TIMESTAMP
possui
comportamento e propriedade variado, dependendo da versão do
MySQL e do modo SQL que o servidor está executando.
Comportamento do
TIMESTAMP
ao executar no modo
MAXDB
Quando o MySQL está executando no modo
SQPDB
, o TIMESTAMP
comporta como DATETIME
. Nenhuma
atualização automática da coluna
TIMESTAMP
ocorre, como descrito no
parágrafo seguinte. O MySQL pode ser executado no modo
MAXDB
a partir da versão 4.1.1. See
Secção 4.1.1, “Opções de Linha de Comando do mysqld
”.
Comportamento do
TIMESTAMP
quando não está executando no
modo MAXDB
O tipo de campo TIMESTAMP
fornece um tipo
que pode ser usado para, automaticamente, marcar operações
INSERT
or UPDATE
com a
data e hora atual. Se você tiver multiplas colunas
TIMESTAMP
, só a primeira é atualizada
automaticamente.
Atualizações automaticas da primeira coluna
TIMESTAMP
ocorrem sob qualquer uma das
seguintes condições:
A coluna não é explicitamente especificada em uma
instrução INSERT
ou LOAD
DATA INFILE
.
A coluna não é explicitamente especificada em uma
instrução UPDATE
e e alguma outra
coluna muda o valor. (Note que um
UPDATE
que coloca em uma coluna o mesmo
valor que ele já possui não irá causar a atualização
da coluna TIMESTAMP
, porque se você
atribui a uma coluna o seu valor atual, MySQL ignora a
atualização para maior eficiência).
Você define explicitamente a uma coluna
TIMESTAMP
o valor
NULL
.
Outras colunas TIMESTAMP
, além da primeira
podem ser definidas com a data e hora atuais. Basta defini-las
com NULL
ou NOW()
Você pode definir colunas TIMESTAMP
com um
valor diferente da data e hora atuais colocando explicitamente
o valor desejado. Isto é verdade mesmo para a primeira coluna
TIMESTAMP
. Você pode usar esta propriedade
se, por exemplo, você quiser que um
TIMESTAMP
tenha seu valor definido como a
data e hora atuais na criação de registros, mas não quer
alterá-los quando o registro for atualizado mais tarde:
Deixe o MySQL definir a coluna quando o registro é criado. Isto irá inicializa-la com a data e hora atuais.
Quando você realizar subsequentes atualizações em
outras colunas do registro, defina explicitamente a coluna
TIMESTAMP
com o valor atual.
Por outro lado, você pode achar que é mais fácil usar uma
coluan DATETIME
que você inicializa com
NOW()
quando o registro for criado e deixa
como está em atualizações subsequentes.
Propriedades
TIMESTAMP
quando executando no modo
MAXDB
Quando o MySQL está executando no modo
MAXDB
, TIMESTAMP
é
idêntico ao DATETIME
. Ele usa o mesmo
formato para armazenar e mostrar valores, e ele tem a mesma
faixa. O MySQL pode ser executado no modo
MAXDB
a partir da versão 4.1.1. See
Secção 4.1.1, “Opções de Linha de Comando do mysqld
”.
Propriedades
TIMESTAMP
a partir do MySQL 4.1 quando não
executado no modo MAXDB
No MySQL 4.1.0, colunas TIMESTAMP
são
armazenadas e mostradas no mesmo formato que colunas
DATETIME
. Isto também significa que ele
não podem ser estreitados ou alargados nos modos descritos no
parágrafo seguinte. Em outras palavras, você não pode usar
TIMESTAMP(2)
,
TIMESTAMP(4)
, etc. Em outros casos, as
propriedades são as mesmas de versões MySQL anteriores.
Propriedades
TIMESTAMP
antes do MySQL 4.1
Valores TIMESTAMP
podem ter valores do
incio de 1970 até algum momento do ano 2037, com a
resolução de um segundo. Valores são mostrados como
números
O formato no qual o MySQL recupera e mostra valores
TIMESTAMP
depende do tamanho do display,
como ilustrado pela tabela que se segue: O formato `cheio'
TIMESTAMP
é de 14 digitos, mas colunas
TIMESTAMP
podem ser criadas com tamanho de
display menores:
Tipo da Coluna | Formato do Display |
TIMESTAMP(14) |
YYYYMMDDHHMMSS |
TIMESTAMP(12) |
YYMMDDHHMMSS |
TIMESTAMP(10) |
YYMMDDHHMM |
TIMESTAMP(8) |
YYYYMMDD |
TIMESTAMP(6) |
YYMMDD |
TIMESTAMP(4) |
YYMM |
TIMESTAMP(2) |
YY |
Todas as colunas TIMESTAMP
tem o mesmo
tamanho de armazenamento, independente do tamanho de display.
Os tamanhos de display mais comuns são 6, 8, 12, e 14. Você
pode especificar um tamanho de display arbitrario na hora da
criação da tabela, mas valores de 0 ou maiores que 14 são
mudados para 14. Valores ímpares de tamanho na faixa de 1 a
13 são mudados para o maior número par mais próximo.
Nota: Na versão 4.1,
TIMESTAMP
é retornado com uma string com o
formato 'YYYY-MM-DD HH:MM:SS'
, e timestamp
de diferentes tamamnhos não são mais suportados.
Você pode especificar calores DATETIME
,
DATE
e TIMESTAMP
usando
qualquer conjunto de formatos comum:
Como uma string nos formatos 'YYYY-MM-DD
HH:MM:SS'
ou 'YY-MM-DD
HH:MM:SS'
. Uma sintaxe ``relaxada'' é
permitida---nenhum caracter de pontuação pode ser usado
como um delimitador entre parte de data ou hora. Por
exemplo, '98-12-31 11:30:45'
,
'98.12.31 11+30+45'
, '98/12/31
11*30*45'
, e '98@12@31
11^30^45'
são equivalentes.
Como uma string nos formatos
'YYYY-MM-DD'
ou
'YY-MM-DD'
. Uma sintaxe ``relaxada'' é
permitida aqui também. Por exemplo,
'98-12-31'
,
'98.12.31'
,
'98/12/31'
, e
'98@12@31'
são equivalentes.
Como uma string sem delimitadores nos formatos
'YYYYMMDDHHMMSS'
ou
'YYMMDDHHMMSS'
, desde que a string
faça sentido como data. Por example,
'19970523091528'
e
'970523091528'
são interpretadas com
'1997-05-23 09:15:28'
, mas
'971122129015'
é ilegal (tem uma parte
de minutos sem sentido) e se torna '0000-00-00
00:00:00'
.
Como uma string sem delimitadores nos formatos
'YYYYMMDD'
ou
'YYMMDD'
, desde que a string tenha
sentido com data. Por exemplo,
'19970523'
e
'970523'
são interpretedas como
'1997-05-23'
, mas
'971332'
é ilegal (tem uma parte de
mês sem sentido) e se torna
'0000-00-00'
.
Como um número nos formatos
YYYYMMDDHHMMSS
ou
YYMMDDHHMMSS
, desde que o número faça
sentido como uma data. Por exemplo,
19830905132800
e
830905132800
são interpretedos como
'1983-09-05 13:28:00'
.
Como um número nos formatos YYYYMMDD
ou YYMMDD
, desde que o número faça
sentido como data. Por exemplo,
19830905
e 830905
são interpretedos como '1983-09-05'
.
Como o resultado de uma função que retorne uma valor
aceitavel em um contexto DATETIME
,
DATE
ou TIMESTAMP
,
tal como NOW()
ou
CURRENT_DATE
.
Valores DATETIME
, DATE
,
ou TIMESTAMP
ilegais são convertidos para
o valor ``zero'' do tipo apropriado ('0000-00-00
00:00:00'
, '0000-00-00'
, ou
00000000000000
).
Para valores especificados com strings que incluem
delimitadores de data, não é necessário especificar dois
digitos para valores de mês ou dia qua são menores que
10
. '1979-6-9'
é o
mesmo que '1979-06-09'
. Similarmente, para
valores especificados como strings que incluem delimitadores
de hora, não é necessário especificar dois digitos para
valores de hora, minutos ou segundo que são menores que
10
. '1979-10-30 1:2:3'
Ré o mesmo que '1979-10-30 01:02:03'
.
Valores especificados como números devem ter 6, 8, 12, ou 14
digitos. Se o número é de 8 ou 14 digitos, ele assume estar
no formato YYYYMMDD
ou
YYYYMMDDHHMMSS
e que o ano é dado pelos 4
primeiros dígitos. Se o é de 6 ou 12 dígitos, ele assume
estar no formato YYMMDD
or
YYMMDDHHMMSS
e que o ano é dado pelos 2 primeiros
digitos. Números que não possua estes tamanho são
interpretados como calores preenchidos com zero até o tamanho
mais próximo.
Valores especificados como strings não delimitadas são
interpretados usando o seu tamanho como dado. Se a string
possui 8 ou 14 caracteres, o ano é assumido como os 4
primeiros caracteres. De outra forma o assume-se que o ano
são os 2 primeiros caracteres. A string é interpretadada
esquerda para direita para encontrar os valores do ano, mês,
dia, hora, minute e segundo, para as partes da string. Isto
significa que você não deve utilizar strings com menos de 6
caracteres. Por exemplo, se você especificar
'9903'
, pensando em representar Março de
1999, você perceberá que o MySQL insere uma data ``zero'' em
sua tabela. Isto ocorre porque os valores do ano e mês são
99
e 03
, mas a parte
contendo o dia não existe (zero), então o valor não é uma
data legal. No entanto, a partir do MySQL 3.23, você pode
especificar explicitamente um valor de zero para representar
dia ou mês faltantes. Por exemplo, você pode usar
'990300'
para inserir o valor
'1999-03-00'
.
Colunas TIMESTAMP
armazena valores legais
utilizando precisão total com a qual os valores foram
especificados, independente do tamanho do display. Isto tem
diversas implicações:
Sempre especifique o ano, mês e dia, mesmo se seus tipos
de coluna são TIMESTAMP(4)
ou
TIMESTAMP(2)
. De outra forma, os
valores não serão datas legais date e um
0
será armazenado.
Se você usa ALTER TABLE
para aumentar
uma coluna TIMESTAMP
, informações
serão mostradas como se antes estivessem ``escondidas''.
De forma similar, reduzindo o tamanho de uma coluna
TIMESTAMP
não causa perda de
informação, exceto no sentido de que menos informação
aparece quando os valores são mostrados.
Embora os valores TIMESTAMP
sejam
armazenados com precisão total, a única função que
opera diretamente com o valor armazenado é
UNIX_TIMESTAMP()
. OUtras funções
operam com o formato do valor recuperado Isto significa
que não se pode usar funções como
HOUR()
or SECOND()
a
menos que a parte relevante do valor
TIMESTAMP
esteja incluído no valor
formatado. POr exemplo, a parte HH
de
uma coluna TIMESTAMP
não é mostrada a
menos que o tamanho do display seja de pelo menos 10, logo
tentar usar HOUR()
em um valor
TIMESTAMP
menor produz um resultado sem
significado.
Você pode, algumas vezes, atribuir valores de um tipo de data para um objeto de um diferente tipo de data. No entanto pode haver algumas alterações de valores ou perda de informação
Se você atribuir um valor de DATE
value a um objeto DATETIME
ou
TIMESTAMP
, a parte da hora do valor
resultante é definido como '00:00:00'
,
porque o vlaor DATE
não contém
informações de hora.
Se você atribuir um valor DATETIME
ou
TIMESTAMP
para um objeto
DATE
, a parte da hora do valor
resultante é deletado, pois o tipo
DATE
não armazena informações de
hora.
Lembre-se de que embora todos os valores
DATETIME
, DATE
, e
TIMESTAMP
possam ser especificados
usando o mesmo conjunto de formatos, os tipos não tem a
mesa faixa de valores. Por exemplo, valores
TIMESTAMP
não podem ser anteriores a
1970
ou posteriores a
2037
. Isto significia que datas como
'1968-01-01'
, são permitidas como
valores DATETIME
ou
DATE
, mas não são válidas para
valores TIMESTAMP
e serão covertidas
para 0
se atribuidas para tais objetos.
Esteja ciente de certas dificuldades quando especificar valores de data:
A forma ``relaxada'' permitida em valores especificados
com strings podem causar certas confusões. Por exemplo,
um valor como '10:11:12'
pode parecer
com um valor de hora devido ao limitador
‘:
’, mas se usado em um
contexto de data será interpretado como o ano
'2010-11-12'
. O valor
'10:45:15'
será convertido para
'0000-00-00'
pois
'45'
não é um valor de mês
permitido.
O servidor MySQL funciona basicamente checando a validade
da data: dias entre 00-31
, mês entre
00-12
, anos entre
1000-9999
. Qualquer data que não
esteja nesta faixa será revetida para
0000-00-00
. Por favor, note que isto
ainda lhe permite armazenar datas invalidas tais como
2002-04-31
. Isto permite a aplicações
web armazenar dados de um formulário sem verificações
adicionais. Para assegurar que a data é valida, faça a
checagem em sua aplicação.
Valores de anos especificados com 2 digitos são ambíguos, pois o século não é conhecido. MySQL interpreta valores de anos com dois digitos usando as seguintes regras:
Valores de ano na faixa de 00-69
são convertidos para 2000-2069
.
Valores de ano na faixa de 70-99
são convertidos para 1970-1999
.
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.