有一列生日。要查找要显示的当前年龄,计算过程如下:
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 functions以timestamp
作为参数,但手册进一步澄清:source
是timestamp
或interval
类型的值表达式。
大胆强调我的。
因此,首先,您可以使用此表单“循环”到几个月:
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/