Tengo una tabla que tiene una columna con varias fechas de la siguiente manera?

15-JAN-2018 07:18:09
13-JAN-2018 09:09:19
15-JAN-2018 05:29:21
15-JAN-2018 05:30:26
13-JAN-2018 07:23:19
13-JAN-2018 02:30:12
14-JAN-2018 02:30:12
14-JAN-2018 03:30:12

¿Es posible convertir todas estas fechas a la 12 respetando la hora / minuto, de la siguiente manera:

12-JAN-2018 07:18:09
12-JAN-2018 09:09:19
12-JAN-2018 05:29:21
12-JAN-2018 05:30:26
12-JAN-2018 07:23:19
12-JAN-2018 02:30:12
12-JAN-2018 02:30:12
12-JAN-2018 03:30:12
0
en Lopes 18 ene. 2018 a las 18:03

3 respuestas

La mejor respuesta

Puede ajustar en intervalos de día:

your_date - numtodsinterval(extract(day from your_date) - 12, 'DAY')

Demo:

alter session set nls_date_format = 'YYYY-MM-DD HH24:MI:SS';

with t (dt) as (
  select to_date('15-JAN-2018 07:18:09', 'DD-MON-YYYY HH24:MI:SS') from dual
  union all select to_date('13-JAN-2018 09:09:19', 'DD-MON-YYYY HH24:MI:SS') from dual
  union all select to_date('15-JAN-2018 05:29:21', 'DD-MON-YYYY HH24:MI:SS') from dual
  union all select to_date('15-JAN-2018 05:30:26', 'DD-MON-YYYY HH24:MI:SS') from dual
  union all select to_date('13-JAN-2018 07:23:19', 'DD-MON-YYYY HH24:MI:SS') from dual
  union all select to_date('13-JAN-2018 02:30:12', 'DD-MON-YYYY HH24:MI:SS') from dual
  union all select to_date('14-JAN-2018 02:30:12', 'DD-MON-YYYY HH24:MI:SS') from dual
  union all select to_date('14-JAN-2018 03:30:12', 'DD-MON-YYYY HH24:MI:SS') from dual
)
select dt, dt - numtodsinterval(extract(day from dt) - 12, 'DAY')
from t;

DT                  DT-NUMTODSINTERVAL(
------------------- -------------------
2018-01-15 07:18:09 2018-01-12 07:18:09
2018-01-13 09:09:19 2018-01-12 09:09:19
2018-01-15 05:29:21 2018-01-12 05:29:21
2018-01-15 05:30:26 2018-01-12 05:30:26
2018-01-13 07:23:19 2018-01-12 07:23:19
2018-01-13 02:30:12 2018-01-12 02:30:12
2018-01-14 02:30:12 2018-01-12 02:30:12
2018-01-14 03:30:12 2018-01-12 03:30:12

extract(day from your_date) te da el número del día, p. 13, 14 o 15. Restar 12 de eso le da la diferencia en días entre cada valor y el 12 del mes (siempre positivo en su muestra, pero también podría ser negativo). La función numtodsinterval() función convierte ese desplazamiento en un intervalo. Y ese intervalo se aplica al valor original.

2
Alex Poole 18 ene. 2018 a las 15:11

Si entiendo bien, puede necesitar algo como esto.

Datos de inicio:

SQL> select * from dates;

D
-------------------------------------------------
15-JAN-18 12:34:45,000000000
14-JAN-18 12:12:45,000000000
11-JAN-18 12:34:45,000000000
12-JAN-18 12:00:45,000000000

Actualizar:

SQL> update dates
  2  set d =  d - trunc(d) + date '2018-01-12';

4 rows updated.

Resultado:

SQL> select * from dates;

D
-------------------------------------------------
12-JAN-18 12:34:45,000000000
12-JAN-18 12:12:45,000000000
12-JAN-18 12:34:45,000000000
12-JAN-18 12:00:45,000000000

Esto simplemente obtiene el tiempo parte de las fechas de inicio y lo agrega a 2018-01-12 00:00

2
Aleksej 18 ene. 2018 a las 15:10

Puedes usar este concepto aquí:

select sysdate, 
       to_date( '12'||to_char(sysdate,'MMYYYYHH24MISS'), 'DDMMYYYYHH24MISS' )
  from dual;

Reemplace sysdate con su nombre de campo (en el segundo elemento seleccionado) y dual con el nombre de su tabla.

Esto reestructura la fecha anteponiendo el día del mes que desee. Y como hemos definido el formato que estamos pasando como 'MMYYYYHH24MISS', pretender que 12 es como codificar la parte DD.

La declaración de selección anterior muestra conceptualmente lo que debe hacer. Sin conocer el nombre de la columna y el nombre de la tabla, es difícil construir una respuesta exacta, pero creo que obtendrá la esencia si ejecuta esa declaración anterior tal como está escrita (es inofensivo).

2
Marc 18 ene. 2018 a las 15:10
48324292