Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

diegohamaz

Between com varchar

Recommended Posts

Galera preciso fazer um intervalo mas minha coluna nao esta bem preparada ela está no formato varchar e está nesse formato

 

MMYYYY

NOV de 2015

112015

 

Como posso fazer um between com sysdate?

 

Pegar registros de 2 meses pra trás até hoje com esse formato de coluna....

 

Tentei isso o nome da coluna é mes referencia

TO_DATE(ti.mes_referencia, 'mm/yyyy') between ADD_MONTHS(TO_DATE(MES_REFERENCIA, 'mm/yyyy'),-2) and TO_DATE(SYSDATE, 'mm/yyyy');

mas nao funcionou... alguem?

Compartilhar este post


Link para o post
Compartilhar em outros sites

TENTE

TO_DATE(ti.mes_referencia, 'mmyyyy') between ADD_MONTHS(TRUNC(SYSDATE,-2) AND TRUNC(Sysdate)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tentei

	SELECT 
   *
   FROM TABELA T1
  where TO_DATE(T1.mes_referencia, 'mmyyyy') between ADD_MONTHS(TRUNC(SYSDATE,-2) AND TRUNC(sysdate)
ORA-00909: número de argumentos inválido
00909. 00000 - "invalid number of arguments"
*Cause:
*Action:
Erro na linha: 8 Coluna: 35
Me retornou isso
Essa minha consulta esta vindo certo mas o between nao esta funcionando
SELECT 
  MES_REFERENCIA,
  to_char(ADD_MONTHS(TO_CHAR(TO_DATE(T1.MES_REFERENCIA,'mmyyyy')),0),'mmyyyy') as data1,
  to_char(ADD_MONTHS(TO_CHAR(TO_DATE(T1.MES_REFERENCIA,'mmyyyy')),-2),'mmyyyy') as data2,
  to_char(sysdate,'mmyyyy')
FROM TABELA T1

Nem com o alias data1 nem como ultimo funciona preciso fazer funcionar essa consultapq se eu alterar acoluna vou ter que mudar todo meu codigo o que nao quero

Compartilhar este post


Link para o post
Compartilhar em outros sites
ORA-00909: número de argumentos inválido
00909. 00000 - "invalid number of arguments"
Uma function recebeu parameto de forma errada.
faltou um ")" num add_months
SELECT 
*
FROM TABELA T1
where TO_DATE(T1.mes_referencia, 'mmyyyy') between ADD_MONTHS(TRUNC(SYSDATE),-2) AND TRUNC(sysdate)

A questão básica é sempre transformar a "data" em char como date.

 

TO_DATE - converte para data

 

TO_CHAR - converte para char

 

atente sempre ao formato

Compartilhar este post


Link para o post
Compartilhar em outros sites

Exatamente isso

SELECT distinct INSMUN,
    MES_REFERENCIA

FROM TABELA T1
where TO_DATE(T1.mes_referencia, 'mmyyyy') between ADD_MONTHS(last_day(sysdate),-3)  AND TRUNC(sysdate)
0871834 112015
0901857 102015
0901857 092015
0871834 092015
0901857 112015
Pra eu pegar o registro em negrito, o que posso fazer ,o que eu preciso é inserir esse registro no mes anterior, vou rodar uma proc e quando virar o mes pra 12 preciso pegar os registro que tem no mes 09 e jogar no mes 10 e que nao estao no mes 10 que é o caso acima.
estou tentando o seguinte
SELECT * 
FROM TABELA T1
where last_day(TO_DATE(T1.mes_referencia, 'mmyyyy')) between ADD_MONTHS(last_day(sysdate),-3)  AND TRUNC(sysdate)
AND NOT  EXISTS (

  SELECT *
  FROM TABELA T2
  where t2.insmun = t1.insmun
  and ADD_MONTHS(last_day(TO_DATE(T2.mes_referencia, 'mmyyyy')),-2) = last_day(TO_DATE(T1.mes_referencia, 'mmyyyy'))  

)

Porem ele pega o registro errado ele pega esse

 

 

0871834 112015
0901857 102015
0901857 092015
0871834 092015
0901857 112015
Queria pegar o que mostrei acima, que é o que nao tem registro no mes 10
0871834 112015
0901857 102015
0901857 092015
0871834 092015
0901857 112015

Compartilhar este post


Link para o post
Compartilhar em outros sites

Motta consegui chegar na minha query agora estou com outro problema

SELECT distinct INSMUN,TIPO_DECLARACAO FROM (

  SELECT 
  
  *
  
  FROM TABELA T1
  where last_day(TO_DATE(T1.mes_referencia, 'mmyyyy')) between ADD_MONTHS(last_day(sysdate),-3)  AND ADD_MONTHS(TRUNC(sysdate),-2)
  AND NOT EXISTS (
      SELECT t2.INSMUN,t2.MES_REFERENCIA
      FROM TABELA T2
      where t1.insmun = t2.insmun
      and last_day(TO_DATE(T2.mes_referencia, 'mmyyyy')) between ADD_MONTHS(last_day(sysdate),-2)  AND ADD_MONTHS(TRUNC(sysdate),-1)
  )
)
GROUP BY DATA_ENTRADA

MINHA PRIMEIRA SELECT ME DUPLICA OS REGISTROS POR CAUSA DA DATA_ENTRADA QUE PODE TER VARIOS REGISTROS COMO FILTRO PELA ULTIMA DATA DE ENTRADA ESTOU FILTRANDO DO MODO ACIMA, POREM NAO ESTA FUNCIONANDO

Compartilhar este post


Link para o post
Compartilhar em outros sites

Trás o "09" pois não existe a ref. 072015 para o id 0871834

 

where t2.insmun = t1.insmun
and ADD_MONTHS(last_day(TO_DATE(T2.mes_referencia, 'mmyyyy')),-2) = last_day(TO_DATE(T1.mes_referencia, 'mmyyyy'))

Compartilhar este post


Link para o post
Compartilhar em outros sites

To com um problema nessa query, que os registros podem vir duplicados devido a dois campos tipo_declaracao e data_entrada

   SELECT 
      T1.*
      FROM TABELA T1
      where last_day(TO_DATE(T1.mes_referencia, 'mmyyyy')) between ADD_MONTHS(last_day(sysdate),-3)  AND ADD_MONTHS(TRUNC(sysdate),-2)
      AND NOT EXISTS (
          SELECT t2.INSMUN,t2.MES_REFERENCIA
          FROM TABELA T2
          where t1.insmun = t2.insmun
          and last_day(TO_DATE(T2.mes_referencia, 'mmyyyy')) between ADD_MONTHS(last_day(sysdate),-2)  AND ADD_MONTHS(TRUNC(sysdate),-1)
      )
      order by t1.DATA_ENTRADA DESC

Esssa query me retorna exatamente quem eu quero porem eles tem dados duplicados

 

INSMUN MES TIPO DATA_ENTRADA

0871834 092015 D 15 26/09/15 10:37:05,000000000
0871834 092015 R 12 26/09/15 10:36:52,000000000
0558477 092015 D 22 27/09/15 11:52:44,000000000
Estou tentando com group by e having count pra filtrar a ultima insmun e com ultima data de entrada da seguinte forma
SELECT INSMUN,TIPO_DECLARACAO, min(rowid)

    FROM (

      SELECT  
      *
      FROM TABELA T1
      where last_day(TO_DATE(T1.mes_referencia, 'mmyyyy')) between ADD_MONTHS(last_day(sysdate),-3)  AND ADD_MONTHS(TRUNC(sysdate),-2)
      AND NOT EXISTS (
          SELECT t2.INSMUN,t2.MES_REFERENCIA
          FROM TABELA T2
          where t1.insmun = t2.insmun
          and last_day(TO_DATE(T2.mes_referencia, 'mmyyyy')) between ADD_MONTHS(last_day(sysdate),-2)  AND ADD_MONTHS(TRUNC(sysdate),-1)
      )
  

)

GROUP BY  INSMUN,TIPO_DECLARACAO;

Porem ele me retorna os registros duplicados mesmo assim...

 

Queria apenas esses registros em negrito o primeiro pode repetir mas pela dat_entrada que é mais atual

 

INSMUN MES TIPO QTDE DATA_ENTRADA

0871834 092015 D 15 26/09/15 10:37:05,000000000
0871834 092015 R 12 26/09/15 10:36:52,000000000
0558477 092015 D 22 27/09/15 11:52:44,000000000
queria ignorar o sublinhado....
se eu coloco rownum ele me traz so um registro e na verdade pode vir varios , nao sei como resolver

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tentou agrupar por

 

INSMUN MES TIPO ?

 

Faça um exemplo simples de como estão os dados e como quer extrai-los.

Compartilhar este post


Link para o post
Compartilhar em outros sites
      SELECT 
      *
      FROM TABELA T1
      where last_day(TO_DATE(T1.mes_referencia, 'mmyyyy')) between ADD_MONTHS(last_day(sysdate),-3)  AND ADD_MONTHS(TRUNC(sysdate),-2)
      AND NOT EXISTS (
          SELECT t2.INSMUN,t2.MES_REFERENCIA
          FROM TABELA T2
          where t1.insmun = t2.insmun
          and last_day(TO_DATE(T2.mes_referencia, 'mmyyyy')) between ADD_MONTHS(last_day(sysdate),-2)  AND ADD_MONTHS(TRUNC(sysdate),-1)
      )
      order by t1.DATA_ENTRADA DESC

Me retorna

 

 

0558477 092015 D 22 27/09/15 11:52:44,000000000 111
0871834 092015 R 12 26/09/15 10:39:52,000000000 199
0871834 092015 D 15 26/09/15 10:37:05,000000000 199
Mas gostaria de retirar o registro em negrito porque a data de entrada dele é menor que a outra porem agrupando ou com having count ele mesmo assim vem na consulta.
Gostaria que me retornasse só essas linhas que no caso o 0871834 com a maior data entrada, os dados se repetem q a coluna tipo e data entrada são diferentes...
0558477 092015 D 22 27/09/15 11:52:44,000000000 111
0871834 092015 R 12 26/09/15 10:39:52,000000000 199
tem alguma sugestão?

Compartilhar este post


Link para o post
Compartilhar em outros sites

TENTE

SELECT *
FROM TBLSOCPROF T1
where ...CONDICOES ...
AND T1.DATA_ENTRADA = (SELECT MAX(T2.T1.DATA_ENTRADA)
                       FROM TBLSOCPROF T2
                       WHERE T2.INSMUN = T1.INSMUN    
                       AND T2.MES = T1.MES)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Consegui , deu uma dor de cabeça rs

SELECT t.insmun, t.mes_referencia,t.QTD_MEDIO,t.QTD_SUPERIOR,t.QTD_HABILITADOS, r.data_entrada
FROM (
    SELECT 
      MAX(T1.data_entrada) as data_entrada,T1.insmun
      FROM TABELA T1
      where last_day(TO_DATE(T1.mes_referencia, 'mmyyyy')) between ADD_MONTHS(last_day(sysdate),-3)  AND ADD_MONTHS(TRUNC(sysdate),-2)
      AND NOT EXISTS (
          SELECT t2.INSMUN,t2.MES_REFERENCIA
          FROM TABELA T2
          where t1.insmun = t2.insmun
          and last_day(TO_DATE(T2.mes_referencia, 'mmyyyy')) between ADD_MONTHS(last_day(sysdate),-2)  AND ADD_MONTHS(TRUNC(sysdate),-1)
      )
     GROUP BY T1.insmun
) r
INNER JOIN tabela t
ON t.insmun = r.insmun 
AND t.data_entrada = r.data_entrada

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.