我有一个表格,其中包含以下信息:-
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函数可以获得所需的输出?
您可以通过在字段前面加上字母P
将resedencyPeriod
转换为间隔类型:
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
类型)或单独字段中的开始和结束日期。 没有这个,你总是会在输出中出现错误。