【问题标题】:Wider default date range in PostgreSQL 10?PostgreSQL 10 中的默认日期范围更广?
【发布时间】:2017-12-16 16:34:01
【问题描述】:

我正在使用 PostgreSQL 10,我在 documentation 中看到 date 类型的最小范围是公元前 4713 年。有没有办法让分钟数更低,比如 5000BC ?还是我应该提出自己的解决方案?

【问题讨论】:

  • 您可能正在寻找存储狩猎采集客户详细信息!
  • 是的 - 你必须有自己的解决方案 - 就像在 int 上保存日期并自己执行所有数学一样丑陋。但真的 - 你想存储什么确切的日期?..
  • @VaoTsun 它是关于一个文化/历史项目,因此必须定义古代时代和日期。我寻找精确的年份。只保存古代年份就可以了,就像公元前 5000 年一样,但这也需要 date 类型。这就是为什么我不能停下来到4713。如果在公元前5000年发生了一场战斗怎么办?想象一下历史学家试图插入 5000BC 并得到一个错误!
  • @KaushikNayak 我不明白你说什么,对不起。改写吧?谢谢
  • 我不擅长历史,当然我们可能知道自 16 世纪以来更精确的日期。我认为您可以做一些丑陋的黑客攻击,例如将 5000 BC 存储为 1000 BC 和 -4K 在默认为 null 的其他字段中,但这样的轮子当然需要知道最早可能的日期和某些函数或 case when 语句,或 + interval -4k 构造.好吧 - 不 - 一旦我尝试提出这些想法 - 我看到这里的任何解决方案都不可靠......也许你最好定义严格的规则,日期保留到公元前 4713 年,更早的日期保留在文本中,不要参与约会操作

标签: postgresql date datetime date-range


【解决方案1】:

您必须构建自定义解决方案,例如将日期保存为两个字段,例如一个date 和一个额外的smallint 偏移量。

也许最简洁的方法是定义您自己的数据类型,在内部使用date 表示较新的值,smallint 表示较旧的日期。您可以在此类型上定义自己的一组运算符,并像普通日期一样使用它。

【讨论】:

  • 是的,我也在想同样的事情。如果我将所有日期存储为默认 AC,并且还有一个布尔值 (0, BC / 1, AC),然后我可以相应地保存或呈现日期怎么办? “问题”是,如果我想从 BC 中提取世纪,我还必须在将其渲染回 UI 之前执行 (-1)。你认为这是可能的还是可行的?
  • 有可能,但整个企业都打开了很多问题。公元前 20000 年 2 月有 28 天还是 29 天?我认为一旦你开始提出这样的问题,你就会放弃存储公元前 4000 年之前的日期的想法。也许您应该定义自己的数据类型 - 我会更新答案。
  • 是的,你是对的。我认为会选择最简单的解决方案。我将有一个时代的“eraBC”表,其中包含几个世纪的int 范围和仅几年的int 范围。用户只需在 BC 年插入 int 就可以了……
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-05-12
  • 2017-01-18
  • 1970-01-01
  • 1970-01-01
  • 2013-03-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多