Qual é a diferença entre a máscara de data 'yy' e 'rr' do oracle?
Pergunta
Exemplo:
select ename from emp where hiredate = todate('01/05/81','dd/mm/yy')
e
select ename from emp where hiredate = todate('01/05/81','dd/mm/rr')
retornar resultados diferentes
Solução
YY permite que você recupere apenas dois dígitos de um ano, por exemplo, o 99 em 1999.Os outros dígitos (19) são atribuídos automaticamente ao século atual.RR converte anos de dois dígitos em anos de quatro dígitos por arredondamento.
50-99 são armazenados em 1950-1999, e as datas que terminam em 00-49 são armazenadas como 2000-2049.O RRRR aceita uma entrada de quatro dígitos (embora não seja necessária) e converte datas de dois dígitos como o RR.AAAA aceita entradas de 4 dígitos, mas não fazem nenhuma data de conversão
Essencialmente, o seu primeiro exemplo assumirá que 81 é 2081, enquanto o RR assume 1981.Portanto, o primeiro exemplo não deve retornar nenhuma linha, pois você provavelmente ainda não contratou ninguém depois de 1º de maio de 2081 :-)
Outras dicas
Minha última experiência com Oracle foi há muito tempo
uhm, foi antes de 2000?:p
...
Você sempre assumirá 19xx?
de acordo com sua fonte, obtemos os seguintes cenários:
USING
ENTERED
STORED
SELECT of date column
YY
22-FEB-01
22-FEB-1901
22-FEB-01
YYYY
22-FEB-01
22-FEB-0001
22-FEB-0001
RR
22-FEB-01
22-FEB-2001
22-FEB-01
RRRR
22-FEB-01
22-FEB-2001
22-FEB-2001
/mp
Compatibilidade com o ano 2000.rr assume que 01 é 2001, yy assume que 01 é 1901
ver: http://www.oradev.com/oracle_date_format.jsp
editar:droga! coto de Michael "dedos rápidos" me vença!
/mp
RR exibe quatro dígitos como 1999 ou 2015 (se for <49 então considerará o século 20)
Sobre RR ou RRRR
Quando inserimos as datas com anos de 2 dígitos (ou seja,09/OUT/15) Então o Oracle pode alterar os séculos automaticamente, portanto, a solução é de 4 datas de dígitos.Mas a versão de 4 dígitos é introduzida em algumas versões recentes; portanto, as soluções para esse problema nas versões anteriores foram RR
ou RRRR
.Mas observe que ele só funciona com o TO_DATE()
função, mas não com o TO_CHAR()
função.
Sempre que forem realizadas inserções/atualizações em datas, devemos sempre esclarecer a data atual no relógio em associação com a tradução da data, uma vez que a Oracle conduz cada tradução de data entrando em contato com o servidor.
Para manter as consistências entre os séculos, é sempre melhor realizar a tradução da data com anos de 4 dígitos.
Sobre AA ou AAAA
Aceita as datas, mas não possui funcionalidade para alterá-las automaticamente.
Esta imagem mostra o comportamento ao inserir data com dois dígitos (ou seja,09/out/15)
RR significa depois de 1990 e yy assume 90 como 2090....como estamos no ano atual,...