- Este tópico contém 10 respostas, 5 vozes e foi atualizado pela última vez 16 anos, 5 meses atrás por
fsitja.
-
AutorPosts
-
29 de setembro de 2009 às 5:02 pm #89983
eversonpiza
ParticipanteOlá amigos.
Estou precisando gravar em uma tabela intervalos de horas, que irei depois buscar qual o registro que o intervalo cobre o sysdate.
Exemplo:
HORA_INI HORA_FIM
00:00 06:00
06:01 17:00
17:01 23:59Ai faria o select where sysdate between hora_ini e hora_fim, qual a melhor forma de fazer isso?
Seria legal se o trunc tivesse uma opção para trazer apenas a hora, assim como faz com a data, mas não achei isso.
Oq estou pensando em fazer é gravar as horas com uma data qquer, e toda vez converter o sysdate, pegando só a hora e concatenando com esta data dummy, mas acho que vai ficar meio feio o código.Oq vcs acham?
Obrigado,
Everson29 de setembro de 2009 às 5:35 pm #89985Rodrigo Mesquita
ParticipanteEverson,
Não entedi esta sua condição do seu select, where sysdate between hora_ini e hora_fim.
29 de setembro de 2009 às 5:36 pm #89986Leonardo Litz
ParticipanteTenta assim:
declare
v_segundos number;
v_hora date;begin
for dd in 1..10 loop
v_segundos := dbms_random.value(1,3600);
v_hora := sysdate + ((1/24/60/60)*v_segundos);dbms_output.put_line(to_char(v_hora,’hh24:mi:ss’));
end loop;
end;
Vlw Leonardo Litz
29 de setembro de 2009 às 5:38 pm #89987Ishii
ParticipanteOlá,
Apenas um ponto a ser analisado. No caso de uma hora começar às 23:00 e terminar às 10:00 do SEGUNDO dia, como ficaria isso, ou isso não vai ocorrer?
Pois a conta final seria: 35 horas e não 11…já que tenho as 24 do dia que passou…
[]s Ishii
29 de setembro de 2009 às 5:40 pm #89989Leonardo Litz
ParticipanteHá, para fazer a comparação, tenta assim:
select d.dt_hr_inicio,d.dt_hr_fim
from tabela d
where to_char(sysdate,’hh24:mi:ss’) between d.dt_hr_inicio and d.dt_hr_fim;Vlw Leonardo Litz
29 de setembro de 2009 às 6:13 pm #89991Rodrigo Mesquita
Participantemas dessa maneira ele só trabalharia com o horário dentro das 24 horas do dia
29 de setembro de 2009 às 6:42 pm #89992Leonardo Litz
ParticipanteSim, pelo que entendi no exemplo acima, é desta forma que se deve controlar. Caso utilize dias tb, substitua tire a formatação e utilize toda a data.
Vlw Leonardo Litz.
29 de setembro de 2009 às 7:48 pm #89994eversonpiza
ParticipanteGalera.
Antes de mais nada obrigado pela atenção.Os intervalos de horas serão dentro do mesmo dia, não vai existir o caso de intervalos que passem de um dia para outro.
Litz neste exemplo que vc passou, como eu faço para ignorar a data (dia/mes/ano) do campo date?
Se eu estiver no mesmo mês blz, pois se omitir a data em um campo date ele vai pegar o dia 1º do mês atual, ou seja o sysdate hoje pegaria 01/09/2009, e na mês que vem ele vai pegar 01/10/2009, mas na tabela vai estar gravado com 01/09/2009.
29 de setembro de 2009 às 8:11 pm #89995Leonardo Litz
ParticipanteFaça assim:
Litz neste exemplo que vc passou, como eu faço para ignorar a data (dia/mes/ano) do campo date?
[color=red]
select to_char(sysdate,'hh24:mi:ss')[/color]
from dualSe eu estiver no mesmo mês blz, pois se omitir a data em um campo date ele vai pegar o dia 1º do mês atual, ou seja o sysdate hoje pegaria 01/09/2009, e na mês que vem ele vai pegar 01/10/2009, mas na tabela vai estar gravado com 01/09/2009.
Vlw Leonardo Litz
1 de outubro de 2009 às 4:56 pm #90041fsitja
ParticipanteIsso que você está procurando se faz com expressões de intervalos, mais ou menos como botei no exemplo abaixo:
SELECT INTERVAL '22:58:30' HOUR TO SECOND "INTERVALO HH:MI:SS",
TO_CHAR(TRUNC(SYSDATE) + INTERVAL '22:58:30' HOUR TO SECOND, 'DD/MM/YYYY HH24:MI:SS') "SOMA SYSDATE"
FROM dual
Em caso de dúvidas dá uma olhada na documentação da Oracle abaixo:
http://download.oracle.com/docs/cd/E118 … SQLRF002211 de outubro de 2009 às 5:17 pm #90042fsitja
ParticipanteVocê pode definir sua coluna da forma abaixo, restringindo via check constraint para não colocarem intervalo de dias, apenas horas, minutos e segundos.
A grande vantagem é fazer as operações aritméticas direto em cima de DATE e INTERVAL, somando e subtraindo sem dificuldade.
CREATE TABLE teste_intervalo
(interv_hora INTERVAL DAY TO SECOND(2),
CONSTRAINT ck_intervalo_hora CHECK (EXTRACT(DAY FROM (interv_hora)) = 0));Table created.
0,03 seconds
insert into teste_intervalo values (INTERVAL '10:09:40' HOUR TO SECOND);
1 row(s) inserted.
insert into teste_intervalo values (INTERVAL '2 22:58:30' DAY TO SECOND);
ORA-02290: restrição de verificação (FSITJA.CK_INTERVALO_HORA) violada
-
AutorPosts
- Você deve fazer login para responder a este tópico.