RES: [oracle_br] Re: Consultas com data
Eu repito : não faz o menor sentido vc pedir TO_DATE num cara que já é date - vc pode consultar o manual "SQL Reference" na função TO_DATE, vc vai ver : "TO_DATE converts char of CHAR, VARCHAR2, NCHAR, or NVARCHAR2 datatype to a value of DATE datatype. The fmt is a date format specifying the format of char. If you omit fmt, then char must be in the default date format. If fmt is 'J', for Julian, then char must be an integer." OU SEJA, o negócio foi feito pra se usar de um jeito, vc está querendo usar de outro, é como um volante , que foi feito pra girar e o sujeito quer é puxar ou empurrar - ok, via de regra o fabricante bota uma segurança extra, não deve dar erro, mas chances há, de forma alguma acho que isso seja o jeito correto de usar, CEDO ou TARDE vc vai encontrar uma exceção Aí não adianta chorar, dizer que sempre funcionou, o correto, se vc quer manipular datas levando em conta a hora é informar a hora... Idem pra um TO_CHAR de uma string.. Já o TO_CHAR de uma data, OK, é documentado e aceito, e com certeza ele não vem hora, aí sim... Ainda acho que isso é o que pode te estar "pegando" aí, faça um teste com a sintaxe correta e veja se é... []s Chiappa --- Em oracle_br@yahoogrupos.com.br, "Wellingthon Cristiano" <[EMAIL PROTECTED]> escreveu > > Então... > > O TO_DATE() é pra forçar que a hora seja 00:00:00, como na consulta ali: > > > >SQL>select to_char(to_date(sysdate), 'dd/mm/ hh24:mi:ss') dh > from dual; > > > >DH > >--- > >03/01/2007 00:00:00 > > > >SQL> select to_char(sysdate, 'dd/mm/ hh24:mi:ss') dh from dual; > > > >DH > >--- > >03/01/2007 11:02:01 > > > > De maneira que a hora fosse indiferente nos dois casos... no between e no > <=/>= ... > > Não é a prática com resposta mais otimizada... mas, funciona... [ ou sempre > funcionou ] > > > > O campo data é do tipo date... > > > > E, o to_char() pra forçar a comparação com o mês/ano ... > > > > Em todos os casos eu acho que era pra ter trazido todas as incidências do > ano de dezembro de 2006... > > Agora a questão dos campos nulos... a multiplicação é a mesma em todas as > consultas... > > :S,,, > > > > Talvez as falhas estejam em coisas ainda mais elementares... > > :D,,, [ do tipo... nãaooo não pode ser... eu fiz mesmo isso??? ] > > > > Bom... > > Vou fazer mais pesquisas aqui... > > > > Obrigado... > > > > Wellingthon Cristiano Alves de Araújo > UpDate Tecnologia - (31) 3292-3722 - BH-MG > Desenvolvimento > > _ > > De: oracle_br@yahoogrupos.com.br [mailto:[EMAIL PROTECTED] Em > nome de jlchiappa > Enviada em: quarta-feira, 3 de janeiro de 2007 07:44 > Para: oracle_br@yahoogrupos.com.br > Assunto: [oracle_br] Re: Consultas com data > > > > Colega, a primeira coisa que salta aos olhos é que tem alguma coisa > estranha aí no seu SQL : no primeiro caso vc pede to_date (ve.data) , > e no segundo caso to_char(ve.data,'mm') - ORA, qual é afinal o > raio do datatype desse ve.data SE FOR date, é ABOBRINHA vc pedir > TO_DATE de um cara que já é date, E se for string é ABOBRINHA vc > pedir TO_CHAR de um cara que já é string, qquer dos casos SÓ PODE dar > lixo, não faz o menor sentido vc converter algo pra alguma coisa que > ele já é... > Outra coisa que se pensa (é o caso 99 vezes em cada 100), quando se > vê consulta que manipula datas não retornando o esperado, é > desenvolvedor caindo num dos FAQs mais básicos do Oracle, qual seja : > no bd Oracle, uma coluna do tipo DATE ** necessariamente ** tem além > da data a HORA nela também, e essa hora PODE ou NÃO estar sendo > informada na hora de gravar valores na coluna, se não for informada o > banco assume zero hora (meia-noite) - a suposição aqui é que nas > colunas do seu WHERE o datatype é DATE, E a hora está sendo gravada E > vc não informa a hora no seu WHERE, aí há registros (óbvio) que não > vêm Experimente usar no WHERE : > and campodata BETWEEN to_date('01/12/2006 00:00:00', 'dd/mm/ > hh24:mi:ss') AND to_date('31/12/2006 23:59:59', 'dd/mm/ > hh24:mi:ss'); > E última coisa, não deve ser o caso mas vou citar : o SUM (e as > funções de grupo de modo geral) DESCONSIDERAM valores nulos, o que > faz sentido já que soma de nulo é nulo, o bd Oracle é rigoroso na > avaliação lógica tri-state, nulo é nulo, não é igual, não é > diferente... Exemplo : > > [EMAIL PROTECTED]:SQL>
RES: [oracle_br] Re: Consultas com data
Então... O TO_DATE() é pra forçar que a hora seja 00:00:00, como na consulta ali: SQL>select to_char(to_date(sysdate), 'dd/mm/ hh24:mi:ss') dh from dual; DH --- 03/01/2007 00:00:00 SQL> select to_char(sysdate, 'dd/mm/ hh24:mi:ss') dh from dual; DH --- 03/01/2007 11:02:01 De maneira que a hora fosse indiferente nos dois casos... no between e no <=/>= ... Não é a prática com resposta mais otimizada... mas, funciona... [ ou sempre funcionou ] O campo data é do tipo date... E, o to_char() pra forçar a comparação com o mês/ano ... Em todos os casos eu acho que era pra ter trazido todas as incidências do ano de dezembro de 2006... Agora a questão dos campos nulos... a multiplicação é a mesma em todas as consultas... :S,,, Talvez as falhas estejam em coisas ainda mais elementares... :D,,, [ do tipo... nãaooo não pode ser... eu fiz mesmo isso??? ] Bom... Vou fazer mais pesquisas aqui... Obrigado... Wellingthon Cristiano Alves de Araújo UpDate Tecnologia - (31) 3292-3722 - BH-MG Desenvolvimento _ De: oracle_br@yahoogrupos.com.br [mailto:[EMAIL PROTECTED] Em nome de jlchiappa Enviada em: quarta-feira, 3 de janeiro de 2007 07:44 Para: oracle_br@yahoogrupos.com.br Assunto: [oracle_br] Re: Consultas com data Colega, a primeira coisa que salta aos olhos é que tem alguma coisa estranha aí no seu SQL : no primeiro caso vc pede to_date(ve.data) , e no segundo caso to_char(ve.data,'mm') - ORA, qual é afinal o raio do datatype desse ve.data SE FOR date, é ABOBRINHA vc pedir TO_DATE de um cara que já é date, E se for string é ABOBRINHA vc pedir TO_CHAR de um cara que já é string, qquer dos casos SÓ PODE dar lixo, não faz o menor sentido vc converter algo pra alguma coisa que ele já é... Outra coisa que se pensa (é o caso 99 vezes em cada 100), quando se vê consulta que manipula datas não retornando o esperado, é desenvolvedor caindo num dos FAQs mais básicos do Oracle, qual seja : no bd Oracle, uma coluna do tipo DATE ** necessariamente ** tem além da data a HORA nela também, e essa hora PODE ou NÃO estar sendo informada na hora de gravar valores na coluna, se não for informada o banco assume zero hora (meia-noite) - a suposição aqui é que nas colunas do seu WHERE o datatype é DATE, E a hora está sendo gravada E vc não informa a hora no seu WHERE, aí há registros (óbvio) que não vêm Experimente usar no WHERE : and campodata BETWEEN to_date('01/12/2006 00:00:00', 'dd/mm/ hh24:mi:ss') AND to_date('31/12/2006 23:59:59', 'dd/mm/ hh24:mi:ss'); E última coisa, não deve ser o caso mas vou citar : o SUM (e as funções de grupo de modo geral) DESCONSIDERAM valores nulos, o que faz sentido já que soma de nulo é nulo, o bd Oracle é rigoroso na avaliação lógica tri-state, nulo é nulo, não é igual, não é diferente... Exemplo : [EMAIL PROTECTED]:SQL>@desc emp Nome Nulo? Tipo - EMPNO NOT NULL NUMBER(4) ENAME VARCHAR2(10) JOB VARCHAR2(9) MGR NUMBER(4) HIREDATE DATE SAL NUMBER(7,2) COMM NUMBER(7,2) DEPTNO NUMBER(2) [EMAIL PROTECTED]:SQL>select empno, sal, hiredate, comm from emp where sal < 1000; EMPNO SAL HIREDATE COMM -- -- --- -- 7369 800 17/12/1980 00:00:00 7900 950 03/12/1981 00:00:00 10 [EMAIL PROTECTED]:SQL>select sum(sal * comm) from emp where sal < 1000; SUM(SAL*COMM) -- 9500 [EMAIL PROTECTED]:SQL>select sum(comm) from emp where sal < 1000; SUM(COMM) -- 10 [EMAIL PROTECTED]:SQL>select sum(sal) from emp where sal < 1000; SUM(SAL) -- 1750 [EMAIL PROTECTED]:SQL> Vê ? no caso acima, o salário de 800 ** não entro ** na soma de sal * comm, porque pra ele comm é nulo, a soma só trouxe 950 * 10 = 9500, pois só pro sal de 950 a commissão (de 10) é não-nula... Pela lógica, tanto preço quanto quantidade NÂO DEVERIAM ser nulos nunca, imagino que não é isso que vc está tendo aí, mas fica a citação... []s Chiappa --- Em [EMAIL PROTECTED] <mailto:oracle_br%40yahoogrupos.com.br> os.com.br, "Wellingthon Cristiano" <[EMAIL PROTECTED]> escreveu > > Senhores... > > Eu fiz as seguintes consultas: > > > > select sum(vei.preco*vei.quantidade) into nVenda > from venda ve, venda_item vei > where ve.id_venda = vei.id_venda > and to_date(ve.data) between to_date('01/12/2006', 'dd/mm/') > and to_date ('31/12/2006', 'dd/mm/'); > > select sum(vei.preco*vei.quantidade) into nVenda > from venda ve, venda_item vei > where ve.id_venda = vei.id_venda > and to_char(ve.data,'mm') = '200612'; > > > s
[oracle_br] Re: Consultas com data
Colega, a primeira coisa que salta aos olhos é que tem alguma coisa estranha aí no seu SQL : no primeiro caso vc pede to_date(ve.data) , e no segundo caso to_char(ve.data,'mm') - ORA, qual é afinal o raio do datatype desse ve.data SE FOR date, é ABOBRINHA vc pedir TO_DATE de um cara que já é date, E se for string é ABOBRINHA vc pedir TO_CHAR de um cara que já é string, qquer dos casos SÓ PODE dar lixo, não faz o menor sentido vc converter algo pra alguma coisa que ele já é... Outra coisa que se pensa (é o caso 99 vezes em cada 100), quando se vê consulta que manipula datas não retornando o esperado, é desenvolvedor caindo num dos FAQs mais básicos do Oracle, qual seja : no bd Oracle, uma coluna do tipo DATE ** necessariamente ** tem além da data a HORA nela também, e essa hora PODE ou NÃO estar sendo informada na hora de gravar valores na coluna, se não for informada o banco assume zero hora (meia-noite) - a suposição aqui é que nas colunas do seu WHERE o datatype é DATE, E a hora está sendo gravada E vc não informa a hora no seu WHERE, aí há registros (óbvio) que não vêm Experimente usar no WHERE : and campodata BETWEEN to_date('01/12/2006 00:00:00', 'dd/mm/ hh24:mi:ss') AND to_date('31/12/2006 23:59:59', 'dd/mm/ hh24:mi:ss'); E última coisa, não deve ser o caso mas vou citar : o SUM (e as funções de grupo de modo geral) DESCONSIDERAM valores nulos, o que faz sentido já que soma de nulo é nulo, o bd Oracle é rigoroso na avaliação lógica tri-state, nulo é nulo, não é igual, não é diferente... Exemplo : [EMAIL PROTECTED]:SQL>@desc emp Nome Nulo?Tipo - EMPNO NOT NULL NUMBER(4) ENAME VARCHAR2(10) JOBVARCHAR2(9) MGRNUMBER(4) HIREDATE DATE SALNUMBER(7,2) COMM NUMBER(7,2) DEPTNO NUMBER(2) [EMAIL PROTECTED]:SQL>select empno, sal, hiredate, comm from emp where sal < 1000; EMPNOSAL HIREDATE COMM -- -- --- -- 7369800 17/12/1980 00:00:00 7900950 03/12/1981 00:00:00 10 [EMAIL PROTECTED]:SQL>select sum(sal * comm) from emp where sal < 1000; SUM(SAL*COMM) -- 9500 [EMAIL PROTECTED]:SQL>select sum(comm) from emp where sal < 1000; SUM(COMM) -- 10 [EMAIL PROTECTED]:SQL>select sum(sal) from emp where sal < 1000; SUM(SAL) -- 1750 [EMAIL PROTECTED]:SQL> Vê ? no caso acima, o salário de 800 ** não entro ** na soma de sal * comm, porque pra ele comm é nulo, a soma só trouxe 950 * 10 = 9500, pois só pro sal de 950 a commissão (de 10) é não-nula... Pela lógica, tanto preço quanto quantidade NÂO DEVERIAM ser nulos nunca, imagino que não é isso que vc está tendo aí, mas fica a citação... []s Chiappa --- Em oracle_br@yahoogrupos.com.br, "Wellingthon Cristiano" <[EMAIL PROTECTED]> escreveu > > Senhores... > > Eu fiz as seguintes consultas: > > > > select sum(vei.preco*vei.quantidade) into nVenda > from venda ve, venda_item vei > where ve.id_venda = vei.id_venda > and to_date(ve.data) between to_date('01/12/2006', 'dd/mm/') > and to_date ('31/12/2006', 'dd/mm/'); > > select sum(vei.preco*vei.quantidade) into nVenda > from venda ve, venda_item vei > where ve.id_venda = vei.id_venda > and to_char(ve.data,'mm') = '200612'; > > > select sum(vei.preco*vei.quantidade) into nVenda > from venda ve, venda_item vei > where ve.id_venda = vei.id_venda > and to_date(ve.data) >= to_date('01/12/2006', 'dd/mm/') > and to_date(ve.data) <= to_date('31/12/2006', 'dd/mm/'); > > > > que, retornaram cada uma... um valor diferente... > > alguém sabe dizer qual a diferença entre as consultas??? > > > > Wellingthon Cristiano Alves de Araújo > UpDate Tecnologia - (31) 3292-3722 - BH-MG > Desenvolvimento > > > > [As partes desta mensagem que não continham texto foram removidas] >