我们是一个开发团队,在Jira中遇到了一个奇怪的bug。为了清理这个bug造成的混乱,我们想要更新Jira数据库中spring的日期。
我们使用的是Windows服务器,我们已经安装了Postgres。
我已经找到了相关的表,当我写
select *
from "AO_60DB71_SPRINT"
找到:
关闭;Complete_Date;END_Date;ID;名称;Rapid_View_ID;序列;开始;Start_Date
t, 1433318043661; 1433318043661; 1;"Sprint 1";1;;t; 1432190100102t; 1433924067416; 1433924067416; 2;"Sprint 2";1;;t; -61681095120000t; 1434528978422; 1434528978422; 3;"Sprint 3";1;;t; -61680144780000t; 1435130684508; 1435130684508; 4;"Sprint 4";1;;t; -61679540276038t; 1435735227248; 1435735227248; 5;"冲刺5";1;;t; -61679115060000t; 1436340875991; 1436340875991; 6;"冲刺6";1;;t; -61678354663584t; 1436944702756; 1436944702756; 7;"冲刺7";1;;t; -61677730634396t; 1437549239766; 1437549239766; 8;"Sprint 8";1;;t; -61677121774120t; 1438154558709; 1438154558709; 9;"Sprint 9";1;;t; -61676520745914t; 1438764063437; 1438764063437; 10;"Sprint 10";1;;t; -61675918235812t; 1439366509383; 1439366509383; 11;"Sprint 11";1;;t; -61675306752010t; 1439970303684; 1439970303684; 12;"Sprint 12";1;;t; -61674703008615f;; 1440602460000; 13;"Sprint 13";1;;t; 1439979707567
这里有趣的字段是存储为bigint的日期值。其中一些值为正,其他值为负。
当我用
来查看日期所代表的含义时select TO_TIMESTAMP("START_DATE" / 1000)
from "AO_60DB71_SPRINT"
"2015-05-21 08:35:00 + 02"
"0015-05-28 11:28:00 + 01"
"0015-06-08 11:27:00 + 01"
"0015-06-15 11:22:04 + 01"
"0015-06-20 09:29:00 + 01"
"0015-06-29 04:42:17 + 01"
"0015-07-06 10:02:46 + 01"
"0015-07-13 11:10:26 + 01"
"0015-07-20 10:07:35 + 01"
"0015-07-27 09:29:25 + 01"
"0015-08-03 11:20:48 + 01"
"0015-08-10 11:03:12 + 01"
"2015-08-19 12:21:47 + 02"
我想要实现的是对上述列的更新,其中0015年的所有日期都应该更新为(bigint对应的)2015年。
我的计划是这样的:
Select
"START_DATE",
EXTRACT(EPOCH FROM INTERVAL '2000 years')*1000 + "START_DATE"
from "AO_60DB71_SPRINT"
但是第二行的结果数据类型是double。
最后我的问题是
- 它是安全的,使一个更新,我插入双精度到bigint列?
- 如果没有,我的转换中缺少的步骤是什么?
- 作为postgres的新手,我如何进行更新?
- 之后我需要做一个提交吗?
Thanks in advance
您正在更新的字段似乎是无害的,因此对该列执行更新的风险很小。
可以在UPDATE
查询中自引用Start_Date
的值。并且还可以使用WHERE
子句来缩小目标行。
使用::type
符号完成转换。
一个可以做你想做的事情的查询可以是这样的:
UPDATE AO_60DB71_SPRINT
SET Start_Date = Start_Date + (EXTRACT(EPOCH FROM INTERVAL '2000 years')*1000)::bigint
WHERE Start_Date < 0;
如果成功,它应该返回UPDATE <count>
而不需要COMMIT
。