Postgres 日期时间和 bigint 处理

Postgres datetime and bigint handling

我们是一个开发团队,运行 遇到了 Jira 中的一个奇怪错误。试图清理我们想要在 Jira 数据库中更新弹簧日期的错误造成的混乱。

我们正在使用 Windows 服务器并且我们在上面安装了 Postgres。

我找到了相关的table,当我写的时候

select *
from "AO_60DB71_SPRINT"

找到这个:


关闭; Complete_Date; END_Date; ID;姓名; Rapid_View_ID;顺序;开始; Start_Date

t;1433318043661;1433226900000;1;"Sprint 1";1;;t;1432190100102 t;1433924067416;-61680144720000;2;"Sprint 2";1;;t;-61681095120000 t;1434528978422;-61679885580000;3;"Sprint 3";1;;t;-61680144780000 t;1435130684508;-61678935480000;4;"Sprint 4";1;;t;-61679540276038 t;1435735227248;-61678337460000;5;"Sprint 5";1;;t;-61679115060000 t;1436340875991;-61677749880000;6;"Sprint 6";1;;t;-61678354663584 t;1436944702756;-61677125820000;7;"Sprint 7";1;;t;-61677730634396 t;1437549239766;-61676517000000;8;"Sprint 8";1;;t;-61677121774120 t;1438154558709;-61675915920000;9;"Sprint 9";1;;t;-61676520745914 t;1438764063437;-61675313460000;10;"Sprint 10";1;;t;-61675918235812 t;1439366509383;-61674701940000;11;"Sprint 11";1;;t;-61675306752010 t;1439970303684;-61674080220000;12;"Sprint 12";1;;t;-61674703008615 f;;1440602460000;13;"Sprint 13";1;;t;1439979707567


这里有趣的字段是存储为 bigints 的日期值。其中一些值是正值,其他值是负值。

当我看日期代表什么时写

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"

但是第二行的结果数据类型是双精度。

最后我的问题是

  1. 在将 double 插入 bigint 列的位置进行更新是否安全?
  2. 如果不是,我的转换中缺少什么步骤?
  3. 完全是 postgres 的新手,我该如何进行更新?
  4. 之后我需要提交吗?

提前致谢

您正在更新的字段似乎无害,因此对此列执行更新的风险很小。

您可以在 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;

成功时它应该 return UPDATE <count> 并且不需要 COMMIT.