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"
但是第二行的结果数据类型是双精度。
最后我的问题是
- 在将 double 插入 bigint 列的位置进行更新是否安全?
- 如果不是,我的转换中缺少什么步骤?
- 完全是 postgres 的新手,我该如何进行更新?
- 之后我需要提交吗?
提前致谢
您正在更新的字段似乎无害,因此对此列执行更新的风险很小。
您可以在 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
.