Necesito añadir 30 minutos a los valores de una columna de fecha de Oracle. Hago esto en mi sentencia SELECT especificando
to_char(fecha_y_hora + (.000694 * 31)
que funciona bien la mayoría de las veces. Pero no cuando la hora está en el límite AM/PM. Por ejemplo, si añades 30 minutos a "12:30" [que es PM], se obtiene "1:00", que es AM. La respuesta que espero es 13:00
. ¿Cuál es la forma correcta de hacerlo?
Además de poder añadir un número de días a una fecha, puede utilizar tipos de datos de intervalo suponiendo que esté en Oracle 9i
o posterior, que pueden ser algo más fáciles 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
Si el tipo de datos del campo es fecha o timestamp, Oracle siempre debería dar el resultado correcto si se suma 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 está intentando multiplicar el valor por 30 minutos, debe utilizar:
select field + 0.5/24 from table;
Sobre la base de la información que ha proporcionado, creo que esto es lo que trató de hacer y estoy bastante seguro de que funciona.
Asegúrese de que Oracle entiende que la hora de inicio es PM, y de especificar 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 sólo el marcador de posición para el indicador de meridiano AM/PM. También podría ser 'PM'
.