Oracle: como adicionar minutos a um timestamp?

Eu preciso adicionar 30 minutos aos valores em uma coluna de data do Oracle. Eu faço isso na minha instrução SELECT especificando

to_char(date_and_time + (.000694 * 31)

que funciona bem na maioria das vezes. Mas não quando o tempo está na fronteira AM / PM. Por exemplo, adicionar 30 minutos a 12:30 [que é PM] retorna 1:00 que é AM. A resposta que eu espero é 13:00 . Qual é a maneira correta de fazer isso?

Todas as outras respostas estão basicamente corretas, mas não acho que alguém tenha respondido diretamente a sua pergunta original.

Supondo que “date_and_time” no seu exemplo seja uma coluna com o tipo DATE ou TIMESTAMP, acho que você só precisa mudar isso:

 to_char(date_and_time + (.000694 * 31)) 

para isso:

 to_char(date_and_time + (.000694 * 31), 'DD-MON-YYYY HH24:MI') 

Parece que o formato de data padrão usa o código “HH” para a hora, não “HH24”.

Além disso, acho que seu termo constante é confuso e impreciso. Eu acho que o que você fez é calcular que (.000694) é sobre o valor de um minuto, e você está multiplicando-o pelo número de minutos que você deseja adicionar (31 no exemplo, embora você tenha dito 30 no texto).

Eu também começaria com um dia e o dividiria nas unidades que você quer dentro do seu código. Nesse caso, (1/48) seria 30 minutos; ou se você quisesse separá-lo para clareza, você poderia escrever ((1/24) * (1/2)).

Isso evitaria erros de arredondamento (exceto aqueles inerentes ao ponto flutuante que não deveriam ter sentido aqui) e é mais claro, pelo menos para mim.

Além de poder adicionar um número de dias a uma data, você pode usar tipos de dados de intervalo desde que você esteja no Oracle 9i ou posterior, o que pode ser um pouco mais fácil de ler,

 SQL> ed Wrote file afiedt.buf SELECT sysdate, sysdate + interval '30' minute FROM dual SQL> / SYSDATE SYSDATE+INTERVAL'30' -------------------- -------------------- 02-NOV-2008 16:21:40 02-NOV-2008 16:51:40 

de http://www.orafaq.com/faq/how_does_one_add_a_day_hour_minute_second_to_a_date_value

A pseudocoluna SYSDATE mostra a data e a hora atuais do sistema. Adicionar 1 a SYSDATE avançará a data em 1 dia. Use frações para adicionar horas, minutos ou segundos à data

 SQL> select sysdate, sysdate+1/24, sysdate +1/1440, sysdate + 1/86400 from dual; SYSDATE SYSDATE+1/24 SYSDATE+1/1440 SYSDATE+1/86400 -------------------- -------------------- -------------------- -------------------- 03-Jul-2002 08:32:12 03-Jul-2002 09:32:12 03-Jul-2002 08:33:12 03-Jul-2002 08:32:13 
 UPDATE "TABLE" SET DATE_FIELD = CURRENT_TIMESTAMP + interval '48' minute WHERE (...) 

Onde interval é um dos

  • ANO
  • MÊS
  • DIA
  • HORA
  • MINUTO
  • SEGUNDO

Eu prefiro usar um interval literal para isso, porque interval '30' minute ou interval '5' second é muito mais fácil de ler, em seguida, 30 / (24 * 60) ou 5 / (24 * 60 * 69)

por exemplo

  • some_date + interval '2' hour
  • some_date + interval '30' minute
  • some_date + interval '5' second
  • some_date + interval '2' day

Você também pode combinar várias unidades em uma expressão:

  • some_date + interval '2 3:06' day to minute

Adiciona 2 dias, 3 horas e 6 minutos ao valor da data

O acima também é SQL padrão e também funciona em vários outros DBMS.

Mais detalhes no manual: https://docs.oracle.com/database/121/SQLRF/sql_elements003.htm#SQLRF00221

Se o tipo de dados do campo for date ou timestamp, o Oracle sempre deverá fornecer o resultado correto se você adicionar o número correto dado em número de dias (ou a fração correta de um dia no seu caso). Então, se você está tentando aumentar o valor em 30 minutos, você deve usar:

 select field + 0.5/24 from table; 

Com base nas informações que você forneceu, acredito que isso é o que você tentou fazer e tenho certeza de que funciona.

Não podemos usar isso

 SELECT date_and_time + INTERVAL '20:00' MINUTE TO SECOND FROM dual; 

Eu sou novo neste domínio.

Certifique-se de que o Oracle entenda que a hora de início é PM e especifique a máscara de formato HH24 para a saída final.

 SELECT to_char((to_date('12:40 PM', 'HH:MI AM') + (1/24/60) * 30), 'HH24:MI') as time FROM dual TIME --------- 13:10 

Nota: o 'AM' no HH: MI é apenas o espaço reservado para o indicador do meridiano de AM / PM. Poderia ser também 'PM'

Com base no que você está pedindo, você quer o formato HH24: MI para to_char.

Para editar a data no oracle você pode tentar

  select to_char( + 5 / 24 + 30 / (24 * 60), 'DD/MM/RRRR hh:mi AM') AS  from  
 SELECT to_char(sysdate + (1/24/60) * 30, 'dd/mm/yy HH24:MI am') from dual; 

simplesmente você pode usar isso com vários formatos de data ….

    Intereting Posts