Tratamento para extrair séculos
Estou estudando para tirar certificação OCA e surgiu uma questão que não consegui entender perfeitamente. Como o Oracle trata a questão dos séculos?. Estou estudando pelo livro "Fundamentos I - SQL - manual do exame (1Z0-051)" e tem um trecho do livro que diz:
"...DD representa os dias, MON representa as tres primeiras letras do mes e RR representa um ano compatível ao ano 2000 (isto é, se RR estiver entre 50 e 99, o servidor Oracle retorna o século anterior, caso contrário retorna o seculo atual)...."
"...o componente do século para o literal '01-JAN-99' se torna o século anterior (vigésimo), 19, e reproduz um valor de data 01-JAN-1999, uma vez que o componente RR, 99, é maior do que 50..."
Não estou entendendo bem essa questão do RR estar entre 50 e 99 e como diz na segunda citação "o componente do século para o literal '01-JAN-99' se torna o século anterior (vigésimo), 19", nesse caso o vigésimo século vale 19.
"...DD representa os dias, MON representa as tres primeiras letras do mes e RR representa um ano compatível ao ano 2000 (isto é, se RR estiver entre 50 e 99, o servidor Oracle retorna o século anterior, caso contrário retorna o seculo atual)...."
"...o componente do século para o literal '01-JAN-99' se torna o século anterior (vigésimo), 19, e reproduz um valor de data 01-JAN-1999, uma vez que o componente RR, 99, é maior do que 50..."
Não estou entendendo bem essa questão do RR estar entre 50 e 99 e como diz na segunda citação "o componente do século para o literal '01-JAN-99' se torna o século anterior (vigésimo), 19", nesse caso o vigésimo século vale 19.
Marcus Almeida
Curtidas 0
Respostas
Lorran Alves
06/05/2014
Cara não entendi muito bem a sua dúvida.Mas da uma olhada no capitulo 2 do livro 1Z0-051.
GOSTEI 0
Eliézio Mesquita
06/05/2014
Olá Marcus Almeida tudo bem?
Esse recurso vai ser usando quanto o seu oracle estiver configurando para trabalhar o ano com apenas 2 digitos, que poder se configurado como YY ou RR, ou seja, no banco será gravado apenas 14 digitos.
Digamos porém, que por algum motivo você precisa mostrar o ano com os 4 digitos, se você tiver configurando seu ano para YY, o oracle vai completar os 2 primeiro digitos mostrando o século atual, porém se seu banco está configurando com RR antes de o oracle mostrar o anos com os 4 digitos ele vai fazer uma validação de 4 regras internas do oracle, que são as regras abaixo:
REGRA 01 - Se seu ano fornecido está entre 00 e 49 e o ano atual está entre 00 e 49, o século é igual a o atual;
REGRA 02 - Se seu ano fornecido está entre 50 e 99 e o ano atual está entre 00 e 49, o século é o atual menos 1;
REGRA 03 - Se seu ano fornecido está entre 00 e 49 e o ano atual está entre 50 e 99, o século é o atual mais 1;
REGRA 04 - Se seu ano fornecido está entre 50 e 99 e o ano atual está entre 50 e 99, o século é o atual menos 1;
Obs.
Entenda ano fornecido como sendo os 2 digitos que estão gravado no seu bando;
Entenda ano atual como sendo os 2 digitos do seu ano atual, no nosso caso 14 de 2014;
Faça um teste com os exemplos abaixo que acredito que vendo o resultado vai facilitar o entendimento:
Espero que ajuda, do contrário pode postar aqui suas dúvidas.
Abcs
Esse recurso vai ser usando quanto o seu oracle estiver configurando para trabalhar o ano com apenas 2 digitos, que poder se configurado como YY ou RR, ou seja, no banco será gravado apenas 14 digitos.
Digamos porém, que por algum motivo você precisa mostrar o ano com os 4 digitos, se você tiver configurando seu ano para YY, o oracle vai completar os 2 primeiro digitos mostrando o século atual, porém se seu banco está configurando com RR antes de o oracle mostrar o anos com os 4 digitos ele vai fazer uma validação de 4 regras internas do oracle, que são as regras abaixo:
REGRA 01 - Se seu ano fornecido está entre 00 e 49 e o ano atual está entre 00 e 49, o século é igual a o atual;
REGRA 02 - Se seu ano fornecido está entre 50 e 99 e o ano atual está entre 00 e 49, o século é o atual menos 1;
REGRA 03 - Se seu ano fornecido está entre 00 e 49 e o ano atual está entre 50 e 99, o século é o atual mais 1;
REGRA 04 - Se seu ano fornecido está entre 50 e 99 e o ano atual está entre 50 e 99, o século é o atual menos 1;
Obs.
Entenda ano fornecido como sendo os 2 digitos que estão gravado no seu bando;
Entenda ano atual como sendo os 2 digitos do seu ano atual, no nosso caso 14 de 2014;
Faça um teste com os exemplos abaixo que acredito que vendo o resultado vai facilitar o entendimento:
select
to_char(to_date('04-jul-15','DD-MON-YY'),'DD-MON-YYYY') "Formato YY",
to_char(to_date('04-jul-15','DD-MON-RR'),'DD-MON-YYYY') "Formato RR"
from dual;Espero que ajuda, do contrário pode postar aqui suas dúvidas.
Abcs
GOSTEI 0
Marcus Almeida
06/05/2014
Eliézio Mesquita muito obrigado.
Consegui entender como funciona, não entendia como o Oracle realizava a validação das 4 regras.
Eu realizei o teste do código que você postou e como resposta obtive dois valores iguais, para ambos os casos, as saídas foram:
Formato RR: 04-JUL-2015
Formato YY: 04-JUL-2015
A configuração para trabalhar com 2 ou 4 dígitos para ano eu realizo no momento da instalação do Oracle ou existe algum local por onde eu possa alterar essa configuração?
Detalhe, estou usando o SqlDeveloper para rodar os scripts mas tenho o Oracle Database 11g Express Edition instalado só não usei o mesmo ainda.
Mais uma vez obrigado.
Consegui entender como funciona, não entendia como o Oracle realizava a validação das 4 regras.
Eu realizei o teste do código que você postou e como resposta obtive dois valores iguais, para ambos os casos, as saídas foram:
Formato RR: 04-JUL-2015
Formato YY: 04-JUL-2015
A configuração para trabalhar com 2 ou 4 dígitos para ano eu realizo no momento da instalação do Oracle ou existe algum local por onde eu possa alterar essa configuração?
Detalhe, estou usando o SqlDeveloper para rodar os scripts mas tenho o Oracle Database 11g Express Edition instalado só não usei o mesmo ainda.
Mais uma vez obrigado.
GOSTEI 0
Eliézio Mesquita
06/05/2014
Olá Marcus Almeida tudo bem?
Vou te passar o mesmo exemplo com outro ano, acho que vai ficar ainda mais claro, estou passando também com visualizar o parâmetro de data
Espero que ajude.
Abcs
Vou te passar o mesmo exemplo com outro ano, acho que vai ficar ainda mais claro, estou passando também com visualizar o parâmetro de data
select
to_char(to_date('04-jul-75','DD-MON-YY'),'DD-MON-YYYY') "Formato YY",
to_char(to_date('04-jul-75','DD-MON-RR'),'DD-MON-YYYY') "Formato RR"
from dual;
Visualiar data:
select sysdate from dual;
Visualizar o paramentro
show parameter nls_date_format;
Alteração para sessão ou seja não afeta o banco inteiro, se você desejar mudar a configuração do banco inteiro onde tem SESSION você deve trocar por SYSTEM.
alter session set nls_date_format = 'dd/mm/yyyy';
alter session set nls_date_format = 'dd/mm/rrrr';
Espero que ajude.
Abcs
GOSTEI 0
Eliézio Mesquita
06/05/2014
Olá Marcus Almeida tudo bem?
Vou te passar o mesmo exemplo com outro ano, acho que vai ficar ainda mais claro, estou passando também com visualizar o parâmetro de data
Espero que ajude.
Abcs
Vou te passar o mesmo exemplo com outro ano, acho que vai ficar ainda mais claro, estou passando também com visualizar o parâmetro de data
select
to_char(to_date('04-jul-75','DD-MON-YY'),'DD-MON-YYYY') "Formato YY",
to_char(to_date('04-jul-75','DD-MON-RR'),'DD-MON-YYYY') "Formato RR"
from dual;
Visualiar data:
select sysdate from dual;
Visualizar o paramentro
show parameter nls_date_format;
Alteração para sessão ou seja não afeta o banco inteiro, se você desejar mudar a configuração do banco inteiro onde tem SESSION você deve trocar por SYSTEM.
alter session set nls_date_format = 'dd/mm/yyyy';
alter session set nls_date_format = 'dd/mm/rrrr';
Espero que ajude.
Abcs
GOSTEI 0