[oracle_br] Re: Consultas com data

2007-01-03 Por tôpico jlchiappa
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]:SQLselect 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]:SQLselect sum(sal * comm) from emp where sal  1000;
  
   SUM(SAL*COMM)
  --
9500
  
  [EMAIL PROTECTED]:SQLselect sum(comm)  from emp where sal  1000;
  
   SUM(COMM)
  --
  10
  
  [EMAIL PROTECTED]:SQLselect 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]





RES: [oracle_br] Re: Consultas com data

2007-01-03 Por tôpico Wellingthon Cristiano
Então...

O TO_DATE() é pra forçar que a hora seja 00:00:00, como na consulta ali:

 

   SQLselect 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]:SQLselect 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]:SQLselect sum(sal * comm) from emp where sal  1000;

SUM(SAL*COMM)
--
9500

[EMAIL PROTECTED]:SQLselect sum(comm) from emp where sal  1000;

SUM(COMM)
--
10

[EMAIL PROTECTED]:SQLselect 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';
 
 
 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

RES: [oracle_br] Re: Consultas com data

2007-01-03 Por tôpico jlchiappa
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:
 
  
 
SQLselect 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]:SQLselect 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]:SQLselect sum(sal * comm) from emp where sal  1000;
 
 SUM(SAL*COMM