有一列生日。要查找要显示的当前年龄,计算过程如下:

SELECT age(birth_date) FROM people

这将返回1 year 10 mons 3 days格式的记录。
我已经根据这个SO post稍微修改了一下。返回date_trunc('month', age(birth_date))。更好,但还是不能满足用户的要求。
通俗地说,当人们谈论年龄时,至少在美国英语中,特别是对幼儿来说,人们会说“14个月”,而不是“1年2个月”。然而,在四岁左右,人们开始说“四岁”。有没有办法写一个快速的查询来完成这个任务?我最初的想法是写一个case/when语句。但它变得复杂了,我无法让这个案子在我下面描述的时间间隔内运作。
以下是我想出的规则:
| Age: m (months) | Display as     |
+-----------------+----------------+
|  < 0            | exp. 2 mons    |
| 0 < m < 24      | 14 mons        |
| 24 <= m < 48    | 2 years 6 mons |
| 48 <= m         | 4 years        |

最佳答案

date_trunc()
尽管函数date_trunc() is listed in the table of date/time functionstimestamp作为参数,但手册进一步澄清:
sourcetimestampinterval类型的值表达式。
大胆强调我的。
因此,首先,您可以使用此表单“循环”到几个月:

SELECT date_trunc('mon', age(birth_date))::text

特定格式
根据您的具体需要,您需要一个CASE语句,如:
SELECT CASE
         WHEN i < interval '1  mon' THEN 'newborn'::text
         WHEN i < interval '12 mon' THEN date_trunc('mon', i)::text
         WHEN i < interval '24 mon' THEN 12 + EXTRACT(month FROM i) || ' mons'
         WHEN i < interval '48 mon' THEN date_trunc('mon', i)::text
         ELSE date_trunc('year', i)::text -- or EXTRACT(year FROM i) || ' years'
       END AS display
FROM  (SELECT age(birth_date) AS i FROM people) sub

->SQLfiddle有一个完整的测试用例。
为了方便起见,可以将其包装在SQL或plpgsql函数中。你可以在这里找到很多例子。

关于sql - 显示的口头年龄计算,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20357073/

10-15 21:46