Postgres:更新日期并保留时间戳的时间

时间:2016-02-23 05:46:47

标签: postgresql

我的字段1包含timestampdatatype,值格式为2016-02-23 12:01:30

我正在运行查询:

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

输出更改为:

  2015-12-31 00:00:00

它将时间转换为所有零。如何更改日期并保留时间戳?

4 个答案:

答案 0 :(得分:10)

试试这个:

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 ...

Demo here

答案 1 :(得分:4)

还有另一种方法,使用DateTime类型。

因此,如果要将表格的日期设置为今天,则可以使用以下方法:

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

current_date切换为“ 2019-02-23”,它也应该可以正常工作。

答案 2 :(得分:1)

只需添加新日期和现有时间。在这里:

+-----+----+---------+
| grp | id | sub_grp |
+-----+----+---------+
|  10 | A2 |       1 |
|  10 | B4 |       2 |
|  10 | F1 |       2 |
|  10 | B3 |       3 |
|  10 | C2 |       1 |
|  10 | A2 |       1 |
|  10 | H4 |       2 |
|  10 | K0 |       2 |
|  10 | Z3 |       2 |
|  10 | F1 |       2 |
|  10 | A1 |       2 |
|  10 | A  |       6 |
|  10 | B  |       6 |
|  10 | B  |       6 |
|  10 | C  |       6 |
|  10 | C  |       6 |
|  10 | D  |       6 |
|  20 | A  |       1 |
|  20 | B  |       1 |
|  20 | B  |       1 |
|  20 | C  |       1 |
|  20 | C  |       1 |
|  20 | D  |       1 |
+-----+----+---------+

甚至更干净:

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

答案 3 :(得分:0)

减去时间戳记会产生一个间隔。可以将所得间隔添加到所需日期,以将所需日期与先前时间相加。

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;

哎呀。直到发布后才意识到这篇文章的年代,但仍然相信它可能对未来的读者有价值。所以我就离开它。