Postgres datetime and bigint handling



我们是一个开发团队,在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。

最后我的问题是

  1. 它是安全的,使一个更新,我插入双精度到bigint列?
  2. 如果没有,我的转换中缺少的步骤是什么?
  3. 作为postgres的新手,我如何进行更新?
  4. 之后我需要做一个提交吗?

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

最新更新