RE: [oracle_br] Re: Dulvidas sql
Muito obrigado a todos pela ajuda. Att Paulo To: oracle_br@yahoogrupos.com.br From: oracle_br@yahoogrupos.com.br Date: Thu, 16 Oct 2014 12:47:57 -0300 Subject: Re: [oracle_br] Re: Dulvidas sql Chiappa Ótima explicação sobre NLS_TERRITORY versus dia da semana. Valeu! [ ] André Em 16 de outubro de 2014 11:32, jlchia...@yahoo.com.br [oracle_br] escreveu: Opa, blz ? Então, é totalmente possível sim, e tem trocentas maneiras de fazer : pode fazer com artimética de datas (ie, ver se o valor da coluna DATE vc já passou exatamente um múltiplo de 7 dias de um dia no passado que foi 5ª feira), pode usar uma expressão com uma das n+1! funções que calculam número do dia da semana e/ou extraem o nome do dia da semana, á sua vontade... Eu acho mais simples usar uma expressão com uma das funções (e ** Certamente ** vc vai receber outras sugestões nesse sentido, isso é mais ou menos o método preferido), apenas aviso que : a) para programar defensivamente, sempre que vc trabalha com datas vc ** TEM ** que se precaver da possibilidade do database aonde o seu código vai rodar estar com configurações de data/calendário/linguagem/território (o chamado NLS) não-padrão... Por exemplo : SQL> alter session set nls_territory = 'AMERICA'; SQL> select level as dow, to_char(trunc(sysdate ,'D') + level, 'Day') as day from dual connect by level <= 7; DOW DAY --- 1 Monday 2 Tuesday 3 Wednesday 4 Thursday 5 Friday 6 Saturday 7 Sunday PORÉM : SQL> alter session set nls_territory = 'UNITED KINGDOM'; SQL> select level as dow, to_char(trunc(sysdate ,'D') + level, 'Day') as day from dual connect by level <= 7; DOW DAY --- 1 Tuesday 2 Wednesday 3 Thursday 4 Friday 5 Saturday 6 Sunday 7 Monday Vê ?? Databases configurados diferentemente podem dar NOMES diferentes para os dias da semana, podem numerar os dias da semana diferentemente Aí então se vc tivesse escrito um : WHERE TRUNC(colunadata, 'D') = 'numerodaquinta-feira' SEM especificar NLS o teu código poderia falhar... EXATAMENTE por isso que praticamente TODAS as funções que trabalham com datas possuem um parâmetro NLS_LANGUAGE, NLS_TERRITORY ou equivalentes Justamente para vc indicar os formatos que está assumindo no seu código, yep yep ?? b) SE vc vai recuperar grande parte dos dados da tabela ok, não se preocupe, MAS se vai recuperar relativamente poucas linhas comparando com o total, pode ser que seja útil um índice na coluna : nesse caso, fique CIENTE que qualquer função aplicada na coluna indexada DESABILITA o uso do índice 'normal', então talvez vc tenha que criar um índice de função ==> para ambas as obs, Veja lá na documentação Oracle para mais dets e refs... []s Chiappa
Re: [oracle_br] Re: Dulvidas sql
Chiappa Ótima explicação sobre NLS_TERRITORY versus dia da semana. Valeu! [ ] André Em 16 de outubro de 2014 11:32, jlchia...@yahoo.com.br [oracle_br] < oracle_br@yahoogrupos.com.br> escreveu: > > > Opa, blz ? Então, é totalmente possível sim, e tem trocentas maneiras de > fazer : pode fazer com artimética de datas (ie, ver se o valor da coluna > DATE vc já passou exatamente um múltiplo de 7 dias de um dia no passado que > foi 5ª feira), pode usar uma expressão com uma das n+1! funções que > calculam número do dia da semana e/ou extraem o nome do dia da semana, á > sua vontade... > Eu acho mais simples usar uma expressão com uma das funções (e ** > Certamente ** vc vai receber outras sugestões nesse sentido, isso é mais ou > menos o método preferido), apenas aviso que : > > a) para programar defensivamente, sempre que vc trabalha com datas vc ** > TEM ** que se precaver da possibilidade do database aonde o seu código vai > rodar estar com configurações de data/calendário/linguagem/território (o > chamado NLS) não-padrão... Por exemplo : > > SQL> alter session set nls_territory = 'AMERICA'; > SQL> select level as dow, > to_char(trunc(sysdate ,'D') + level, 'Day') as day > from dual > connect by level <= 7; > > DOW DAY > --- > 1 Monday > 2 Tuesday > 3 Wednesday > 4 Thursday > 5 Friday > 6 Saturday > 7 Sunday > > PORÉM : > > SQL> alter session set nls_territory = 'UNITED KINGDOM'; > > SQL> select level as dow, > to_char(trunc(sysdate ,'D') + level, 'Day') as day > from dual > connect by level <= 7; > > DOW DAY > --- > 1 Tuesday > 2 Wednesday > 3 Thursday > 4 Friday > 5 Saturday > 6 Sunday > 7 Monday > > Vê ?? Databases configurados diferentemente podem dar NOMES diferentes > para os dias da semana, podem numerar os dias da semana diferentemente > Aí então se vc tivesse escrito um : > > WHERE TRUNC(colunadata, 'D') = 'numerodaquinta-feira' > > SEM especificar NLS o teu código poderia falhar... EXATAMENTE por isso > que praticamente TODAS as funções que trabalham com datas possuem um > parâmetro NLS_LANGUAGE, NLS_TERRITORY ou equivalentes Justamente para vc > indicar os formatos que está assumindo no seu código, yep yep ?? > > b) SE vc vai recuperar grande parte dos dados da tabela ok, não se > preocupe, MAS se vai recuperar relativamente poucas linhas comparando com o > total, pode ser que seja útil um índice na coluna : nesse caso, fique > CIENTE que qualquer função aplicada na coluna indexada DESABILITA o uso do > índice 'normal', então talvez vc tenha que criar um índice de função > > > ==> para ambas as obs, Veja lá na documentação Oracle para mais dets e > refs... > > []s > > Chiappa > >