如何在 postgresql 中添加句点,其中句点以年、月和日为单位



我有一个表格,其中包含以下信息:-

stateCode, empCode resedencyPeriod
10          2001     3Y5M20D
11          2002     5Y9M25D
12          2001     9Y9M20D
10          2001     9Y5M25D
11          2002     11Y11M22D

其中 3Y5M20D 代表 3 年 5 个月零 20 天。现在我想知道任何员工在一个州呆了多长时间。所需输出如下

stateCode, empCode totalresedencyPeriod
10          2001     12Y11M15D
11          2002     17Y9M17D
12          2001     9Y9M20D

是否有任何postgresql函数可以获得所需的输出?

您可以通过在字段前面加上字母PresedencyPeriod转换为间隔类型:

select stateCode, empCode, ('P' || resedencyPeriod)::interval
from employee;
 statecode | empcode |         interval         
-----------+---------+--------------------------
        10 |    2001 | 3 years 5 mons 20 days
        11 |    2002 | 5 years 9 mons 25 days
        12 |    2001 | 9 years 9 mons 20 days
        10 |    2001 | 9 years 5 mons 25 days
        11 |    2002 | 11 years 11 mons 22 days
(5 rows)
select 
    stateCode, 
    empCode, 
    justify_days(sum(('P' || resedencyPeriod)::interval)) period
from employee
group by 1, 2
order by 1, 2;
 statecode | empcode |          period          
-----------+---------+--------------------------
        10 |    2001 | 12 years 11 mons 15 days
        11 |    2002 | 17 years 9 mons 17 days
        12 |    2001 | 9 years 9 mons 20 days
(3 rows)

理论上可以按照您的要求去做,但非常不可取。 如果你无论如何都想这样做,那么这就是方法:

Postgresql 具有interval数据类型,非常擅长处理时间段。 它包含在一个值中存储日,月和年的能力,并支持基本的算术。

它还包含一个函数justify_days()假设每个月有 30 天。 只要您知道数据中的每个月都是 30 天,就可以了。


正如我所指出的,这是非常危险的... 您不能简单地将天数 togeather 添加到相等的月份,因为一个月可能有 28 到 31 天之间的任何时间,并且您没有记录哪些月份由句点表示。

您确实应该将其记录为天数(可能是interval类型)或单独字段中的开始和结束日期。 没有这个,你总是会在输出中出现错误。

最新更新