- Este tópico contém 6 respostas, 3 vozes e foi atualizado pela última vez 9 anos atrás por Renato José Correia Lima.
-
AutorPosts
-
28 de julho de 2015 às 10:16 pm #107644Lucas Oliveira de MouraParticipante
Boa tarde Forum,
Estou com uma duvida com relação a trabalhar com DATE
Quando eu faço: SELECT DATA+1 FROM TABELA – me retorna o campo com 1 dia a mais.
Porém eu uso esse campo DATE no modo (YYYY/MM/DD HH24:MI:SS) e sempre preciso fazer um update de 1 segundo nesse campo.
Atualmente eu primeiro pesquiso a data e quanto faço o update eu ja escrevo o incremento desse segundo.
Estou tentando montar um bloco pra automatizar isso, só preciso saber como eu faço o incremento desse segundo.
PS: o campo deve permanecer com o tipo DATE.
Agradeço a atenção
28 de julho de 2015 às 10:29 pm #107645rmanParticipante@Lucas Oliveira de Moura
1 dia dividido por 24 horas, temos 1 hora, 1 hora divido por 60 segundos temos 1 segundo.
SELECT SYSDATE,SYSDATE+(1/24/60) FROM DUAL;
29 de setembro de 2015 às 6:43 pm #107746Lucas Oliveira de MouraParticipanteconsegui da seguinte forma:
select to_date (Max(data)) + 1/(24*60*60) segundo from(
select max(dataocorrencia)data from tabela1 where diaocorrencia = 20150101 and idturno = '0010760280113000711438987613'
union all
select max(dataocorrencia)data from tabela2 where diaocorrencia = 20150101 and idturno = '0010760280113000711438987613');
Ou seja, da tabela1 ou da tabela2 me traga a maior data daquele turno e coloque 1 segundo.
A estrutura das tabelas é algo bem simples:
IDTURNO, DATAOCORRENCIA, DATAFIMOu seja, quando a DATAFIM está null, eu pego e preencho com 1 segundo a mais do que a DATAOCORRENCIA.
Até aqui deu certo, ele trás um segundo perfeitamente, eu pego o resultado dessa query e faço um update. Perfeito.
Agora eu to apanhando pra tentar automatizar isso, alguém consegue me dar um “norte”.
Da forma que eu fiz, eu consigo trazer 1 dia só de 1 turno.
Eu preciso fazer ele buscar um período e vários turnos dentro daquele período.
Estou tentando um bloco anonimo com FOR mas esta difícil.
Eu preciso que meu bloco, encontre todas as DATAFIM que sejam NULL e faça o UPDATE de 1 segundo a mais da DATAOCORRENCIA daquele IDTURNO.
Alguma ideia?
Agradeço a atenção.
29 de setembro de 2015 às 8:53 pm #107751rmanParticipante@Lucas Oliveira de Moura
Seria isso?
UPDATE TABELA SET DATAFIM = DATAOCORRENCIA+(1/24/60)
WHERE IDTURNO = :IDTURNO
AND DATAFIM IS NULL
30 de setembro de 2015 às 6:03 am #107761Lucas Oliveira de MouraParticipanterman.. primeiramente agradeço a atenção.
Então.. quanto a isso blz.. é bem parecido com o UPDATE que eu usei aqui… mas só q dessa forma eu farei de um a um…
eu queria montar um bloco anonimo onde eu coloco o periodo e ele sai “varrendo” todos FIM Null daquele periodo.. aí tipo.. achou um FIM NULL? preenche esse null com 1 segunda a mais da dataocorrencia…
estou tentando com FOR… com WHILE… ta dificil rs.. mas ja evolui algumas coisinhas aqui…
eu não sei como fazer um FOR percorrer uma tabela usando um BETWEEN.. pq especificamente precisa ser do periodo que eu falar…
30 de setembro de 2015 às 3:08 pm #107762rmanParticipante@Lucas Oliveira de Moura
Isso é um rotina dentro de um sistema, ou isso é apenas uma correção pontual?
Se for pontual isso já resolve para todos os NULLs:
UPDATE TABELA SET DATAFIM = DATAOCORRENCIA+(1/24/60)
WHERE DATAFIM IS NULL
Se for uma rotina é só criar um CURSOR, e correr passando o ID.
4 de novembro de 2015 às 8:19 pm #107876Renato José Correia LimaParticipanteBoa tarde,
Seria assim:
declare
Dt_ocorr date;
begin
select max(a.data)
into Dt_ocorr
from (select max(dataocorrencia) data from tabela1
where diaocorrencia = 20150101
and idturno = '0010760280113000711438987613'
union all
select max(dataocorrencia) data from tabela2
where diaocorrencia = 20150101
and idturno = '0010760280113000711438987613') a;
for reg in (select '1' tab, idturno, rowid data from tabela1
where diaocorrencia = 20150101
and idturno = '0010760280113000711438987613'
union all
select '2' tab, idturno, rowid data from tabela2
where diaocorrencia = 20150101
and idturno = '0010760280113000711438987613'
order by 3 asc)
loop
Dt_ocorr := Dt_ocorr+(1/24/60/60);
if reg.tab = '1' then
update tabela1 set dataocorrencia = dt_ocorr where rowid = reg.rowid;
else
update tabela2 set dataocorrencia = dt_ocorr where rowid = reg.rowid;
end if;
end loop;
end;
/Att.
-
AutorPosts
- Você deve fazer login para responder a este tópico.