【问题标题】:Postgres datetime and bigint handlingPostgres 日期时间和 bigint 处理
【发布时间】:2015-11-13 00:05:18
【问题描述】:

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

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

我找到了相关的表和我写的时候

select *
from "AO_60DB71_SPRINT"

找到这个:


关闭;完成日期;结束日期; ID;姓名; Rapid_View_ID;顺序;开始;开始日期

t;1433318043661;1433226900000;1;“冲刺 1”;1;;t;1432190100102 t;1433924067416;-61680144720000;2;“冲刺 2”;1;;t;-61681095120000 t;1434528978422;-61679885580000;3;“冲刺 3”;1;;t;-61680144780000 t;1435130684508;-61678935480000;4;“冲刺 4”;1;;t;-61679540276038 t;1435735227248;-61678337460000;5;“冲刺 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;“冲刺 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


这里有趣的字段是存储为 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"

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

我的问题到底是

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

提前致谢

【问题讨论】:

  • 我只有一个问题:为什么有人会在整数列中存储日期或时间戳?
  • 我问自己同样的事情!我认为这是 Jira/Atlassian 的事情。不过不确定。我们安装了产品,发现了这个奇怪的地方并解决了我们的问题..

标签: postgresql datetime bigint


【解决方案1】:

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

您可以在 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 &lt;count&gt;,并且不需要COMMIT

【讨论】:

  • 由于区分大小写,我只需要做一些小的修改。非常感谢!
猜你喜欢
  • 2019-01-08
  • 2016-03-07
  • 1970-01-01
  • 2016-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-08
  • 1970-01-01
相关资源
最近更新 更多