微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

数据字段中的“无数据”

如何解决数据字段中的“无数据”

我有一个Postgresql数据库,用于存储物种发生数据。字段之一是表示发生日期的真实日期字段。

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

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

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

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

有什么建议吗?我在俯视什么吗?以前是否在其他地方解决过这个问题(如果是,我没有找到)?

解决方法

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

此处有更多信息:https://www.postgresql.org/docs/current/rangetypes.html

,

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。