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
INSERTouLOAD DATA INFILE. - A coluna não é explicitamente especificada em uma instrução
UPDATEe e alguma outra coluna muda o valor. (Note que umUPDATEque 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
TIMESTAMPo 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
TIMESTAMPcom 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
YYYYMMDDHHMMSSouYYMMDDHHMMSS, desde que o número faça sentido como uma data. Por exemplo,19830905132800e830905132800são interpretedos como'1983-09-05 13:28:00'. - Como um número nos formatos
YYYYMMDDouYYMMDD, desde que o número faça sentido como data. Por exemplo,19830905e830905são interpretedos como'1983-09-05'. - Como o resultado de uma função que retorne uma valor aceitavel em um contexto
DATETIME,DATEouTIMESTAMP, 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 um0será armazenado. - Se você usa
ALTER TABLEpara aumentar uma colunaTIMESTAMP, informações serão mostradas como se antes estivessemescondidas
. - De forma similar, reduzindo o tamanho de uma coluna
TIMESTAMPnão causa perda de informação, exceto no sentido de que menos informação aparece quando os valores são mostrados. - Embora os valores
TIMESTAMPsejam 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 valorTIMESTAMPesteja incluído no valor formatado. POr exemplo, a parteHHde uma colunaTIMESTAMPnão é mostrada a menos que o tamanho do display seja de pelo menos 10, logo tentar usarHOUR()em um valorTIMESTAMPmenor 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
DATEvalue a um objetoDATETIMEouTIMESTAMP, a parte da hora do valor resultante é definido como'00:00:00', porque o vlaorDATEnão contém informações de hora. - Se você atribuir um valor
DATETIMEouTIMESTAMPpara um objetoDATE, a parte da hora do valor resultante é deletado, pois o tipoDATEnão armazena informações de hora. - Lembre-se de que embora todos os valores
DATETIME,DATE, eTIMESTAMPpossam ser especificados usando o mesmo conjunto de formatos, os tipos não tem a mesa faixa de valores. Por exemplo, valoresTIMESTAMPnão podem ser anteriores a1970ou posteriores a2037. Isto significia que datas como'1968-01-01', são permitidas como valoresDATETIMEouDATE, mas não são válidas para valoresTIMESTAMPe serão covertidas para0se 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-69são convertidos para2000-2069. - Valores de ano na faixa de
70-99são convertidos para1970-1999.
Retornar
- Valores de ano na faixa de