Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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?
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
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
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
Não entendi, desculpe.
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
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'))**
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
Tentou agrupar por
INSMUN MES TIPO ?
Faça um exemplo simples de como estão os dados e como quer extrai-los.
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?
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)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.insmunDo seu jeito deu certo tambem rs
Qual vc acha que mantenho?
Se o seu deu certo deixa quieto
TENTE
TO_DATE(ti.mes_referencia, 'mmyyyy') between ADD_MONTHS(TRUNC(SYSDATE,-2) AND TRUNC(Sysdate)