我有一张表,其中包含以下信息: -
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函数可以获得所需的输出?
答案 0 :(得分:1)
您可以通过在字段前加resedencyPeriod
字母来P
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)
<property name="javax.persistence.schema-generation.database.action"
value="create"/>
答案 1 :(得分:1)
理论上可以做你要求但高度不可取的。如果你想要做到这一点,那么这里是如何:
Postgresql具有interval
数据类型,非常擅长处理时间段。它包含将日,月和年存储在一个值中的功能,并支持基本的算术。
它还包含一个函数justify_days()
,假设每个月都有30天。只要您知道数据中的每个月都是30天,这是可以的。
正如我所指出的那样,这是非常危险的...你不能简单地将天数添加到相同的月份,因为一个月可能有28到31天的任何事情而且你没有记录哪个月由一段时间代表。
您确实应该在单独的字段中将其记录为天数(可能在interval
类型中)或开始日期和结束日期。如果没有这个,你的输出总会出现错误。