如何在postgresql中添加句点,其中句号在年,月和日中可用?

时间:2016-05-23 11:43:18

标签: 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函数可以获得所需的输出?

2 个答案:

答案 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类型中)或开始日期和结束日期。如果没有这个,你的输出总会出现错误。