Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql &引用;无数据“;在数据字段中_Postgresql_Date_Missing Data - Fatal编程技术网

Postgresql &引用;无数据“;在数据字段中

Postgresql &引用;无数据“;在数据字段中,postgresql,date,missing-data,Postgresql,Date,Missing Data,我有一个PostgreSQL数据库,存储物种发生数据。其中一个字段是指示事件日期的true date字段 然而,特别是历史数据,我们没有确切的信息。例如,有时它只包含月份或年份。其他人,这可能是一个季节和一年。等等 在过去,我们用一个“虚拟”日期和其他字段的附加注释来处理这个问题。例如,对于2010年3月,我们可能会默认为2010-03-01 然而,我们的一位生物学家对此提出了一些担忧。她一点也不喜欢这些虚假的数据 我到处搜索,看看博士后是否只允许在日期字段中输入一个月和一年,还是只允许输入一年

我有一个PostgreSQL数据库,存储物种发生数据。其中一个字段是指示事件日期的true date字段

然而,特别是历史数据,我们没有确切的信息。例如,有时它只包含月份或年份。其他人,这可能是一个季节和一年。等等

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

然而,我们的一位生物学家对此提出了一些担忧。她一点也不喜欢这些虚假的数据

我到处搜索,看看博士后是否只允许在日期字段中输入一个月和一年,还是只允许输入一年。相反,它是否可以有和超出范围的日期来标记无数据,例如2010-03只捕获月份和年份,或者2010年仅捕获年份,或者2010-03-00表示缺少日期。我是空的。(这很接近:)


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

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


此处的更多信息:

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


更多信息: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


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


对目前的数据有什么担忧?是的,如果信息不存在,那么我不确定是否有任何系统能够改善这一点。它归结为获取您拥有的信息,或者如果信息不完整(不管是什么),则将其声明为空。在某个时刻,有人将不得不决定如何分配数据。对当前数据提出了哪些担忧?是的,如果信息不存在,那么我不确定是否有任何系统能够改善这一点。它归结为获取您拥有的信息,或者如果信息不完整(不管是什么),则将其声明为空。总有一天会有人决定如何分配数据。谢谢。这是一个很好的解决方案,类似于我所考虑的“解决方案”。谢谢,谢谢。这是一个很好的解决方案,类似于我所考虑的“解决方案”。我很感激,这很有趣。我不熟悉范围数据类型。我现在正在进一步调查。谢谢。@ToddFagin好的一面是您的查询只需要很少的转换。在大多数情况下,您可以将不等式转换为使用
lower(my_column)
而不是
my_column
来保持兼容性,然后在有用的地方集成
重叠
。更多功能可用:这很有趣。我不熟悉范围数据类型。我现在正在进一步调查。谢谢。@ToddFagin好的一面是您的查询只需要很少的转换。在大多数情况下,您可以将不等式转换为使用
lower(my_column)
而不是
my_column
来保持兼容性,然后在有用的地方集成
重叠
。更多可用功能: