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:
> 
>  
> 
>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

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:

 

   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

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]: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]
>