Tratamento para extrair séculos

Oracle

06/05/2014

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.
Marcus Almeida

Marcus Almeida

Curtidas 0

Respostas

Lorran Alves

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

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:

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

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.
GOSTEI 0
Eliézio Mesquita

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

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

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

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
POSTAR