【问题标题】:"No Data" in data fields数据字段中的“无数据”
【发布时间】:2020-08-31 19:09:02
【问题描述】:

我有一个存储物种发生数据的 PostgreSQL 数据库。其中一个字段是表示发生日期的真实日期字段。

但是,尤其是历史数据,我们没有准确的信息。例如,有时它只包含月份或年份。其他的,可能是一个季节和一年。等等。

过去,我们使用“虚拟”日期和其他字段中的附加备注来处理此问题。例如,对于 2010 年 3 月,我们可能会默认为 2010-03-01。

但是,我们的一位生物学家对此提出了一些担忧。她根本不喜欢虚拟数据。

我搜索了高低,看看 Postgres 是否允许在日期字段中仅输入月份和年份或仅输入年份。相反,它是否可以有和超出范围的日期来标记没有数据,例如2010-03 仅捕获月份和年份或 2010 仅捕获年份或 2010-03-00 以指示缺少日期。我来空了。 (这很接近:How to store dates with different levels of precision in postgres?

有什么建议吗?我忽略了什么吗?之前有没有在其他地方解决过这个问题(如果有,我没找到)?

【问题讨论】:

  • 对当前数据提出了哪些担忧?
  • 是的,如果信息不存在,那么我不确定是否有任何系统会改进它。它归结为获取您拥有的信息,或者如果它不完整(无论是什么),然后将其声明为 NULL。在某些时候,有人将不得不决定如何分配数据。

标签: postgresql date missing-data


【解决方案1】:

您可以将该列转换为daterange 类型。 对于精确的日期,范围的两个边界将是相同的日期。 对于一个月,下限可能是该月的 1 日,上限可能是该月的最后一天。

更多信息在这里:https://www.postgresql.org/docs/current/rangetypes.html

【讨论】:

  • 这很有趣。我不熟悉范围数据类型。我现在正在进一步研究它们。谢谢。
  • @ToddFagin 好消息是您的查询只需要很少的转换。在大多数地方,您可以将不等式转换为使用lower(my_column) 而不是my_column 以保持兼容性,然后在可能有用的地方集成OVERLAPSBETWEEN。更多功能可用:postgresql.org/docs/current/functions-range.html
【解决方案2】:

Postgres 只允许在日期/时间戳字段中使用有效的日期/日期时间。所以像2010-03-00 这样的东西是行不通的。一种解决方案是使用文本字段并即时进行日期转换。另一个是做你现在正在做的事情,并有另一个字段(varchar)作为日期的模板。比如:

occurrence_fld     date_template
2020-06-21         season:summer
2020-08-01         format:yyyy-mm
2020-08-31         format:yyyy-mm-dd

然后您可以创建一个函数,该函数使用模板根据标签(季节、格式)创建日期。作为使用“格式”模板的查询示例:

select to_char('2020-08-01'::date, split_part('format:yyyy-mm', ':', 2));
 to_char 
---------
 2020-08

select to_char('2020-08-31'::date, split_part('format:yyyy-mm-dd', ':', 2));
  to_char   
------------
 2020-08-31

【讨论】:

  • 谢谢。这是一个很好的解决方案,类似于我考虑的一个“解决方法”。我很感激。
猜你喜欢
  • 1970-01-01
  • 2021-10-05
  • 1970-01-01
  • 2014-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多