Select dá erro de ORA01722-Invalid Number

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
pc_delphi
Rank: Analista Pleno
Rank: Analista Pleno
Mensagens: 128
Registrado em: Qui, 29 Mai 2008 6:44 pm
Localização: São Paulo
Tudo posso, nAquel que me fortalece
Filipenses 4:13

Esse meu selec dá o erro de ORA-01722-Invalid Number. O campo DAT_YM é do tipo VarChar2(6). Como eu resolvo isso? Será a parte da hora? Tem como eu retirar a parte da hora?

Selecionar tudo

SELECT
	EMI_N_CODIGO
	,DAT_YM
	,SUM(QTD_TRAN)
FROM
	PTL_FRAUDES_mês
WHERE
	DAT_YM BETWEEN TO_CHAR(  '10/08/2011 00:00:00' ,'YYYY') || '01' AND TO_CHAR(  '25/04/2012 23:59:59' ,'YYYY') || '12'
GROUP BY
	EMI_N_CODIGO
	,DAT_YM
ORDER BY 1,2
DanielNN
Moderador
Moderador
Mensagens: 641
Registrado em: Seg, 03 Set 2007 3:26 pm
Localização: Fortaleza - CE
att,

Daniel N.N.

Supondo que "DAT_YM" venha no formato ex: 201102 referenciando fevereido de 2011.
Suas datas de início e fim são parâmetros???? São tipo DATE ou VARCHAR2??
Se for VARCHAR você não pode fazer:

Selecionar tudo

TO_CHAR('10/08/2011 00:00:00' ,'YYYY')
pois você tem que informar na mascara a representação da data que quer mostrar. Mas não é data. Vai dar erro.
Porém para extrair o ano basta:

Selecionar tudo

SUBSTR(param_date,7,4)
Se já for DATE basta fazer:

Selecionar tudo

extract(YEAR FROM param_date)
Agora outra alternativa, se seu campo "DAT_YM" não tiver indices, seria transformar ele para DATE:

Selecionar tudo

TO_DATE(DAT_YM,'RRRRMM')
E seus BETWEEN já serem DATE normalmente.

O principal de seu erro é só conversão de Tipo. '10/08/2011 00:00:00' é VARCHAR até que você faça um:

Selecionar tudo

TO_DATE('10/08/2011 00:00:00','dd/mm/rrrr hh24:mi:ss')
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 21 visitantes