restar - sumar años a una fecha oracle
Oracle: ¿cómo agregar minutos a una marca de tiempo? (11)
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
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?
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''
No podemos usar esto
SELECT date_and_time + INTERVAL ''20:00'' MINUTE TO SECOND FROM dual;
Soy nuevo en este dominio.
Para editar la fecha en el oráculo, puedes probar
select to_char(<columnName> + 5 / 24 + 30 / (24 * 60),
''DD/MM/RRRR hh:mi AM'') AS <logicalName> from <tableName>
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
Según lo que está solicitando, quiere el formato HH24: MI para to_char.
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.
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í.
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
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 ....
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