Pergunta

Eu preciso adicionar 30 minutos para valores em uma coluna de data 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, a adição de 30 minutos para 12:30 [que é PM] retorna 1:00 que é AM. A resposta que eu esperava é 13:00. Qual é a maneira correta de fazer isso?

Foi útil?

Solução

Todas as outras respostas são basicamente certo, mas eu não acho que alguém está respondido diretamente sua pergunta original.

Assumindo que "date_and_time" no seu exemplo é uma coluna com o tipo DATE ou TIMESTAMP, acho que você só precisa mudar o seguinte:

to_char(date_and_time + (.000694 * 31))

a esta:

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

Parece que seu formato de data padrão utiliza o código "HH" para a hora, não "HH24".

Além disso, eu acho que o seu termo constante é tanto confuso e impreciso. Eu acho que o que você fez é calcular que (0,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ê disse 30 no texto).

Também gostaria de começar com um dia e dividi-lo em unidades que você quer dentro de seu código. Neste caso, (1/48) seria de 30 minutos; ou se você queria quebrá-lo para maior clareza, você poderia escrever ((1/24) * (1/2)).

Isso evitaria erros de arredondamento (exceto para aqueles inerentes ponto que deve ser sentido aqui flutuante) e é mais claro, pelo menos para mim.

Outras dicas

Além de ser capaz de adicionar um número de dias para uma data, você pode usar tipos de dados de intervalo supondo que você está em Oracle 9i ou posterior, 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

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

Os sysdate mostra pseudo-coluna do atual sistema data e tempo. Adicionando 1 a SYSDATE vai avançar a data em 1 dia. Usar frações para adicionar horas, minutos ou segundos para a 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
  • O DIA
  • HORA
  • MINUTO
  • SEGUNDA

Eu prefiro usar um literal interval para isso, porque interval '30' minute ou interval '5' second é muito mais fácil de ler, então 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 única expressão:

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

Adiciona 2 dias, 3 horas e 6 minutos para o valor de data

A descriçã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 é a data ou data e hora, a Oracle deve sempre dar o resultado correto se você adicionar o número correto determinado em número de dias (ou uma fração correta de um dia no seu caso). Então, se você está tentando bater o valor em 30 minutos, você deve usar:

select field + 0.5/24 from table;

Com base na informação fornecida, acredito que este é o que você tentou fazer e estou bastante certeza de que ele funciona.

Nós não podemos usar este

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

Eu sou novo neste domínio.

Certifique-se de que a Oracle entende que a hora de início é PM, e para especificar 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 de meridiano AM / PM. Poderia ser também 'PM'

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

Para editar Data no Oracle você pode tentar

  select to_char(<columnName> + 5 / 24 + 30 / (24 * 60),
           'DD/MM/RRRR hh:mi AM') AS <logicalName> from <tableName>

assim muito facilmente

i adicionado 10 minutos até a data do sistema e sempre em detrimento uso das funções de servidor Db não personalizado.

select to_char(sysdate + NUMTODSINTERVAL(10,'MINUTE'),'DD/MM/YYYY HH24:MI:SS') from dual;
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 ....

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top