有一列生日。要查找当前显示年龄,计算方法如下:
SELECT age(birth_date) FROM people
以1 year 10 mons 3 days
格式返回记录。
我已根据此SO post稍微修改了这个date_trunc('month', age(birth_date))
。返回1 year 10 mons
。它更好,但仍然无法满足用户的要求。
通俗地说,当人们谈论年龄时,至少在美国英语中,特别是对于年幼的孩子,人们说“14个月”而不是“1年2个月”。然而,在四岁左右,人们转而说“4年”。有没有办法写一个快速查询来完成这个?我最初的想法是写一个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 |
答案 0 :(得分:2)
使用内置功能无法满足该要求。在最好的情况下,他们将允许你在2年内改变24个月;不是相反。
您希望创建一个pgsql函数来生成所需的输出(可能是文本),或者(更好)在应用程序级别管理它。在应用程序级别执行此操作将允许您将其本地化并将辅助条件作为奖励。
答案 1 :(得分:1)
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函数中。你会在SO上找到很多例子。
答案 2 :(得分:0)
您可以在CASE语句和DATE_PART中执行此操作,如here所示。
CASE WHEN age < 24 THEN //Show something.
WHEN age > 24 AND age < 48 THEN //Show something else
ELSE //Show age as required
END