Os Tipos DATETIME
, DATE
e TIMESTAMP
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. MariaDB 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. MariaDB 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 MariaDB e do modo SQL que o servidor está executando.
Comportamento do TIMESTAMP
ao executar no modo MAXDB
Quando o MariaDB 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 MariaDB pode ser executado no modo MAXDB
a partir da versão 4.1.1. Leia "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
ouLOAD DATA INFILE
. - A coluna não é explicitamente especificada em uma instrução
UPDATE
e e alguma outra coluna muda o valor. (Note que umUPDATE
que coloca em uma coluna o mesmo valor que ele já possui não irá causar a atualização da colunaTIMESTAMP
, porque se você atribui a uma coluna o seu valor atual, MariaDB ignora a atualização para maior eficiência). - Você define explicitamente a uma coluna
TIMESTAMP
o valorNULL
.
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 MariaDB 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 MariaDB 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 MariaDB pode ser executado no modo MAXDB
a partir da versão 4.1.1. Leia "Opções de Linha de Comando do mysqld
".
Propriedades TIMESTAMP
a partir do MariaDB quando não executado no modo MAXDB
No MariaDB 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 MariaDB anteriores.
Propriedades TIMESTAMP
antes do MariaDB 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 MariaDB 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 sintaxerelaxada
é 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 sintaxerelaxada
é 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
ouYYMMDDHHMMSS
, desde que o número faça sentido como uma data. Por exemplo,19830905132800
e830905132800
são interpretedos como'1983-09-05 13:28:00'
. - Como um número nos formatos
YYYYMMDD
ouYYMMDD
, desde que o número faça sentido como data. Por exemplo,19830905
e830905
são interpretedos como'1983-09-05'
. - Como o resultado de uma função que retorne uma valor aceitavel em um contexto
DATETIME
,DATE
ouTIMESTAMP
, tal comoNOW()
ouCURRENT_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 MariaDB 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 MariaDB 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)
ouTIMESTAMP(2)
. De outra forma, os valores não serão datas legais date e um0
será armazenado. - Se você usa
ALTER TABLE
para aumentar uma colunaTIMESTAMP
, informações serão mostradas como se antes estivessemescondidas
. - 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 comoHOUR()
orSECOND()
a menos que a parte relevante do valorTIMESTAMP
esteja incluído no valor formatado. POr exemplo, a parteHH
de uma colunaTIMESTAMP
não é mostrada a menos que o tamanho do display seja de pelo menos 10, logo tentar usarHOUR()
em um valorTIMESTAMP
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 objetoDATETIME
ouTIMESTAMP
, a parte da hora do valor resultante é definido como'00:00:00'
, porque o vlaorDATE
não contém informações de hora. - Se você atribuir um valor
DATETIME
ouTIMESTAMP
para um objetoDATE
, a parte da hora do valor resultante é deletado, pois o tipoDATE
não armazena informações de hora. - Lembre-se de que embora todos os valores
DATETIME
,DATE
, eTIMESTAMP
possam ser especificados usando o mesmo conjunto de formatos, os tipos não tem a mesa faixa de valores. Por exemplo, valoresTIMESTAMP
não podem ser anteriores a1970
ou posteriores a2037
. Isto significia que datas como'1968-01-01'
, são permitidas como valoresDATETIME
ouDATE
, mas não são válidas para valoresTIMESTAMP
e serão covertidas para0
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 MariaDB funciona basicamente checando a validade da data: dias entre
00-31
, mês entre00-12
, anos entre1000-9999
. Qualquer data que não esteja nesta faixa será revetida para0000-00-00
. Por favor, note que isto ainda lhe permite armazenar datas invalidas tais como2002-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. MariaDB interpreta valores de anos com dois digitos usando as seguintes regras:
- Valores de ano na faixa de
00-69
são convertidos para2000-2069
. - Valores de ano na faixa de
70-99
são convertidos para1970-1999
.
Retornar
- Valores de ano na faixa de