Problemas Usando Colunas DATE
O formato de um valor DATE
é 'YYYY-MM-DD'
. De acordo com o padrão SQL, nenhum outro formato é permitido. Você deve usar este formato em expressões UPDATE
e na cláusula WHERE de insrtruções SELECT
. Por exemplo:
mysql> SELECT * FROM nome_tabela WHERE date >= '1997-05-05';
Por conveniência, o MariaDB converte automaticamente uma data em um número se a data é usada em um contexto numérico (e vice versa). Ele também é esperto o bastante para permitir uma forma de string relaxada
em uma atualização e em uma cláusula WHERE
que compara uma data a uma coluna TIMESTAMP
, DATE
, ou DATETIME
. (Forma relaxada significa que qualquer caracter de pontuação pode seu usado como separador entre as partes. Por exemplo, '1998-08-15'
e '1998#08#15'
são equivalentes). O MariaDB também pode converter uma string sem separadores (como '19980815'
), desde que ela faça sentido como uma data.
A data especial '0000-00-00'
pode ser armazenada e recuperada como '0000-00-00'.
Ao usar uma data '0000-00-00'
com o MyODBC
, ele a converterá automaticamente em NULL
em sua versão 2.50.12 e acima, porqie o ODBC não pode tratar este tipo de data.
Como o MariaDB realiza a conversão descrita acima, a seguinte instrução funcionará:
mysql>INSERT INTO nome_tabela (idate) VALUES (19970505);
mysql>INSERT INTO nome_tabela (idate) VALUES ('19970505');
mysql>INSERT INTO nome_tabela (idate) VALUES ('97-05-05');
mysql>INSERT INTO nome_tabela (idate) VALUES ('1997.05.05');
mysql>INSERT INTO nome_tabela (idate) VALUES ('1997 05 05');
mysql>INSERT INTO nome_tabela (idate) VALUES ('0000-00-00');
mysql>SELECT idate FROM nome_tabela WHERE idate >= '1997-05-05';
mysql>SELECT idate FROM nome_tabela WHERE idate >= 19970505;
mysql>SELECT MOD(idate,100) FROM nome_tabela WHERE idate >= 19970505;
mysql>SELECT idate FROM nome_tabela WHERE idate >= '19970505';
No entatnto o seguinte não funcionará:
mysql> SELECT idate FROM nome_tabela WHERE STRCMP(idate,'19970505')=0;
STRCMP()
é uma função string, assim ela converte idate
em uma string e realiza um comparação de string. Ela não converte '19970505'
em uma datae e realiza uma comparaçãas de data.
Note que o MariaDB faz uma verificação muito limitada da validade da data. Se você aramazenar uma data incorreto, tal como '1998-2-31'
, a data invalida será armazenada.
Como o MariaDB empacota a data para armazenamento, ele não pode armazenar qualquer data dada como já que ela não caberia dentro do buffer de resultado. As regras de aceitação das datas são:
- Se o MariaDB pode armazenar e recuperar um data dada, a data errada é acieta para colunas
DATE
eDATETIME
. - Todos os valores de dia entre 0-31 são aceitos para qualquer data. Isto torna muito conveniente para plicações web nas quais você pede ano, mês e dia em 3 campos diferentes.
- O campo do dia ou mês pode ser zero. Isto é conveniente se você quiser armazenar uma data de aniversário em uma coluna
DATE
e você não sabea parte da data.
Se a data não pode ser convertida para qualquer valor razoável, um 0
é armazenado no campo DATE
, o qual será recuperado como 0000-00-00
. Isto é uma questão tanto de velocidade quanto de conveniência já que acreditamos que a responsabilidade do banco de dados é recuperar a mesma data que você armazenou (mesmo se a data não era logicamente correta em todos os casos). Nós pensamos que é papel da aplicação verificar as datas, e não do servidor.