Oracle: ¿cómo agregar minutos a una marca de tiempo?

Necesito agregar 30 minutos a los valores en una columna de fecha de Oracle. Hago esto en mi instrucción SELECT especificando

to_char(date_and_time + (.000694 * 31)

que funciona bien la mayor parte del tiempo. Pero no cuando el tiempo está en el borde AM / PM. Por ejemplo, agregar 30 minutos a 12:30 [que es PM] devuelve 1:00 que es AM. La respuesta que espero es a las 13:00 . ¿Cuál es la forma correcta de hacer esto?

Todas las otras respuestas son básicamente correctas, pero no creo que nadie haya respondido directamente a su pregunta original.

Suponiendo que “date_and_time” en su ejemplo es una columna con tipo DATE o TIMESTAMP, creo que solo necesita cambiar esto:

 to_char(date_and_time + (.000694 * 31)) 

a esto:

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

Parece que el formato de fecha predeterminado utiliza el código “HH” para la hora, no “HH24”.

Además, creo que su término constante es a la vez confuso e impreciso. Supongo que lo que hizo fue calcular que (.000694) es aproximadamente el valor de un minuto, y lo está multiplicando por la cantidad de minutos que desea agregar (31 en el ejemplo, aunque dijo 30 en el texto).

También comenzaría con un día y lo dividiría en las unidades que desee dentro de su código. En este caso, (1/48) sería de 30 minutos; o si desea dividirlo para mayor claridad, puede escribir ((1/24) * (1/2)).

Esto evitaría los errores de redondeo (excepto los inherentes al punto flotante que no deberían tener sentido aquí) y es más claro, al menos para mí.

Además de poder agregar un número de días a una fecha, puede usar los tipos de datos de intervalo suponiendo que está en Oracle 9i o posterior, que puede ser algo más fácil de leer,

 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

La pseudocolumna SYSDATE muestra la fecha y hora actual del sistema. Agregar 1 a SYSDATE adelantará la fecha en 1 día. Use fracciones para agregar horas, minutos o segundos a la fecha

 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 (...) 

Donde el interval es uno de

  • AÑO
  • MES
  • DÍA
  • HORA
  • MINUTO
  • SEGUNDO

Prefiero usar un literal de interval para esto, porque el interval '30' minute o interval '5' second es mucho más fácil de leer que 30 / (24 * 60) o 5 / (24 * 60 * 69)

p.ej

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

También puedes combinar varias unidades en una expresión:

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

Agrega 2 días, 3 horas y 6 minutos al valor de la fecha

Lo anterior también es SQL estándar y también funciona en muchos otros DBMS.

Más detalles en el manual: https://docs.oracle.com/database/121/SQLRF/sql_elements003.htm#SQLRF00221

Si el tipo de datos del campo es fecha o marca de tiempo, Oracle siempre debe dar el resultado correcto si agrega el número correcto dado en número de días (o una fracción correcta de un día en su caso). Por lo tanto, si intenta subir el valor en 30 minutos, debe usar:

 select field + 0.5/24 from table; 

Según la información que proporcionó, creo que esto es lo que intentó hacer y estoy bastante seguro de que funciona.

No podemos usar esto

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

Soy nuevo en este dominio.

Asegúrese de que Oracle entienda que la hora de inicio es PM y especifique la máscara de formato HH24 para la salida 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: el 'AM' en el HH: MI es solo el marcador de posición para el indicador meridiano AM / PM. Podría ser también 'PM'

Según lo que está solicitando, quiere el formato HH24: MI para to_char.

Para editar la fecha en el oracle, puedes probar

  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; 

simplemente puede usar esto con varios formatos de fecha ….