Как изменить дату не затрагивая время?

Как можно изменить дату без времени, то есть чтобы время оставалось неизменным?

Формат DATEВ БД: 01.06.2020 8:55:46.

UPDATE t_pet t SET t.date_input='31.05.2020' WHERE t.id in (
111 ,
222 ,
333 )

Так получаю 31.05.2020 00:00:00, а желаемый результат - 31.05.2020 8:55:46.


Ответы (2 шт):

Автор решения: 0xdb

Вот так:

UPDATE t_pet t SET 
    t.date_input = date'2020-05-31' + (t.date_input - trunc (t.date_input))
WHERE t.id in (111, 222, 333)

Воспроизводимый пример (на db<>fiddle):

alter session set nls_date_format='dd.mm.yyyy hh24:mi:ss' 

select date'2020-05-31' + (dt - trunc (dt)) res from (
    select to_date ('01.06.2020 8:55:46') dt 
    from dual);

RES
-------------------
31.05.2020 08:55:46
→ Ссылка
Автор решения: Alex R.

Дата в БД представлена как число, где 1.0 соответствует одним целым суткам. Поэтому если необходимо изменить дату на известное количество дней с неизменным временем, то достаточно отнять/прибавить целое число дней.

select 
  dt - 1
from (select to_date ('01.06.2020 8:55:46') dt from dual);

RES
-------------------
31.05.2020 08:55:46

Иногда это удобно использовать, когда необходимо работать с часами и минутами. Например, прибавить 2 часа 30 минут (1 / 24 * 2.5)

select 
  dt + 1 / 24 * 2.5
from (select to_date ('01.06.2020 8:55:46') dt from dual);

RES
-------------------
01.06.2020 11:25:46
→ Ссылка