[英]Colloquial age calculation for display
有一列生日。 要查找當前顯示年齡,計算方法如下:
SELECT age(birth_date) FROM people
這將以1 year 10 mons 3 days
的格式返回記錄。
我基於這個SO帖子稍微修改了這個是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 |
使用內置函數您將無法滿足該要求。 在最好的情況下,他們將允許你在2年內改變24個月; 而不是相反。
您想要創建一個pgsql函數來生成所需的輸出(可能是文本),或者(更好)在應用程序級別管理它。 在應用程序級別執行此操作將允許您將其本地化並將輔助條件作為獎勵。
date_trunc()
雖然函數date_trunc()
在日期/時間函數表中列為將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上找到很多例子。
您可以在CASE語句和DATE_PART中執行此操作 ,如此處所示。
CASE WHEN age < 24 THEN //Show something.
WHEN age > 24 AND age < 48 THEN //Show something else
ELSE //Show age as required
END
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.