Apêndice B. Apoio a data e hora
O PostgreSQL utiliza um analisador heurístico interno para dar suporte a toda entrada de data e hora. Data e hora são entradas como cadeias de caracteres, e divididas em campos distintos com base na determinação preliminar do tipo de informação que pode estar contida no campo. Cada campo é interpretado e, em seguida: atribuído um valor numérico, ignorado, ou rejeitado. O analisador contém tabelas internas de procura para todos os campos textuais, incluindo meses, dias da semana e zonas horárias.
Este apêndice inclui informações sobre o conteúdo destas tabelas de procura, e descreve os passos utilizados pelo analisador para decodificar data e hora.
As entradas dos tipos data e hora são todas decodificadas utilizando o seguinte procedimento.
-
Dividir a cadeia de caracteres da entrada em elementos (tokens), e categorizar cada elemento como sendo uma cadeia de caracteres, hora, zona horária ou número.
-
Se o elemento numérico contiver dois-pontos (:), então é uma cadeia de caracteres de hora. Incluir todos os dígitos e dois-pontos subseqüentes.
-
Se o elemento numérico contiver hífen (-), barra (/), ou dois ou mais pontos (.), então é uma cadeia de caracteres de data que pode conter o mês na forma de texto.
-
Se o elemento contiver apenas números, então é um campo único ou uma data ISO 8601 concatenada (por exemplo, 19990113 para 13 de janeiro de 1999), ou hora (por exemplo, 141516 para 14:15:16).
-
Se o elemento começar por um sinal de mais (+), ou de menos (-), então é uma zona horária ou um campo especial.
-
Se o elemento for uma cadeia de caracteres, estabelecer correspondência com as cadeias de caracteres possíveis.
-
Fazer uma pesquisa binária do elemento na tabela, para ver se é uma cadeia de caracteres especial (por exemplo, today), um dia da semana (por exemplo, Thursday), um mês (por exemplo, January), ou uma palavra sem efeito (por exemplo, at, on).
Definir valor e máscara de bit para os campos. Por exemplo, definir ano, mês e dia para today e, adicionalmente, hora, minuto e segundo para now.
-
Se não for encontrado, fazer uma pesquisa binária semelhante na tabela para fazer a correspondência entre o elemento e uma zona horária.
-
Se ainda não for encontrado, lançar um erro.
-
Quando o elemento é um número ou campo numérico:
-
Se contiver 8 ou 6 dígitos, e nenhum outro campo de data foi lido anteriormente, então interpretar como uma "data concatenada" (por exemplo, 19990118 ou 990118). A interpretação é YYYYMMDD ou YYMMDD.
-
Se o elemento tiver 3 dígitos, e um ano já tiver sido lido, então interpretar como dia do ano.
-
Se contiver 4 ou 6 dígitos, e o ano já tiver sido lido, então interpretar como hora (HHMM ou HHMMSS).
-
Se contiver 3 ou mais dígitos, e nenhum campo data foi encontrado anteriormente, interpretar como ano (isto força a ordem yy-mm-dd para os demais campos de data).
-
Senão, a ordem do campo data é assumida como definida por DateStyle: mm-dd-yy, dd-mm-yy, ou yy-mm-dd. Lançar um erro se o campo mês ou dia estiver fora do intervalo permitido.
-
Se for especificado BC, tornar o ano negativo e adicionar um para armazenamento interno (Não existe ano zero no Calendário Gregoriano
e, portanto, numericamente 1 BC se torna o ano zero).
-
Se não for especificado BC, e o campo do ano tiver comprimento de dois dígitos, então ajustar o ano para quatro dígitos. Se o campo for inferior a 70, então adicionar 2000, senão adicionar 1900.
Dica: Os anos Gregorianos AD 1-99
podem ser entrados utilizando 4 dígitos com zeros à esquerda (por exemplo, 0099 é AD 99). As versões anteriores do PostgreSQL aceitavam anos com três dígitos e com um dígito, mas a partir da versão 7.0 as regras ficaram mais rigorosas, para reduzir a possibilidade de ambigüidade.