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
3 respuestas
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.
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
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).
Nuevas preguntas
sql
El lenguaje de consulta estructurado (SQL) es un lenguaje para consultar bases de datos. Las preguntas deben incluir ejemplos de código, estructura de tabla, datos de muestra y una etiqueta para la implementación de DBMS (por ejemplo, MySQL, PostgreSQL, Oracle, MS SQL Server, IBM DB2, etc.) que se utiliza. Si su pregunta se relaciona únicamente con un DBMS específico (usa extensiones / características específicas), use la etiqueta de ese DBMS en su lugar. Las respuestas a las preguntas etiquetadas con SQL deben usar SQL estándar ISO / IEC.