Postgres datetime和bigint处理

时间:2015-08-19 15:27:17

标签: postgresql datetime bigint

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

我们正在使用Windows服务器,并且我们已经安装了Postgres。

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

select *
from "AO_60DB71_SPRINT"

找到这个:

封闭; Complete_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"

但是第二行的结果数据类型是double。

我的问题到底是

  1. 在将big插入bigint列的位置进行更新是否安全?
  2. 如果没有,我转换中缺少的是什么?
  3. 完全是postgres的新手,如何进行更新?
  4. 之后我是否需要提交?
  5. 提前致谢

1 个答案:

答案 0 :(得分:2)

您正在更新的字段似乎无害,因此执行此列的更新几乎没有风险。

您可以在Start_Date查询中自行引用UPDATE的值。并且还可以使用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