数据字段中的“无数据”

问题描述

我有一个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

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...