У меня есть field1 с timestamp, datatype и форматом значений 2016-02-23 12:01:30.

Я выполняю запрос:

UPDATE <table> set field1 = '2015-12-31'::timestamp::date where .....

Результат изменится на:

  2015-12-31 00:00:00

Он переводит время во все нули. Как изменить дату и сохранить отметку времени?

10
Arnold Cristobal 23 Фев 2016 в 08:46

4 ответа

Лучший ответ

Попробуй это:

UPDATE mytable 
SET field1 = '2015-12-31'::timestamp + 
             EXTRACT(HOUR FROM field1) * INTERVAL '1 HOUR' +
             EXTRACT(MINUTE FROM field1) * INTERVAL '1 MINUTE' +
             EXTRACT(SECOND FROM field1) * INTERVAL '1 SECOND' 
WHERE ...

Демо здесь

18
Giorgos Betsos 23 Фев 2016 в 06:30

Вычитание временных меток дает интервал. Результирующий интервал может быть добавлен к желаемой дате, чтобы получить желаемую дату с предшествующим временем.

with ats (old_tz) as (select now() )  
select old_tz, '2015-12-31'::timestamptz + (old_tz - date_trunc('day', old_tz)) new_tz 
from ats;

Упс. Не осознавал, сколько лет этому посту, до момента публикации, но все же считаю, что он может быть ценным для будущих зрителей. Так что я просто оставлю это.

0
Belayer 29 Янв 2020 в 03:35

Просто добавьте новую дату и существующее время. Вот:

UPDATE mytable 
SET field1 = '2015-12-31'::date + field1::time with time zone
WHERE ...;

Или даже более чистый срез:

UPDATE mytable 
SET field1 = field1 - field1::date + '2015-12-31'::date
WHERE ...;
1
Stefanov.sm 29 Июн 2020 в 17:25

Есть другой способ - использовать тип DateTime.

Итак, если вы хотите установить дату таблицы на сегодняшний день, вы можете использовать это:

UPDATE table SET column = current_date::date + column::time;

Переключите current_date на "2019-02-23", и он тоже должен работать.

3
Nephilim 30 Июн 2020 в 08:13