我的字段1包含timestamp
,datatype
,值格式为2016-02-23 12:01:30
。
我正在运行查询:
UPDATE <table> set field1 = '2015-12-31'::timestamp::date where .....
输出更改为:
2015-12-31 00:00:00
它将时间转换为所有零。如何更改日期并保留时间戳?
答案 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 ...
答案 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;
哎呀。直到发布后才意识到这篇文章的年代,但仍然相信它可能对未来的读者有价值。所以我就离开它。