 函數(shù)計算年齡與任意兩個時間點之間的時間跨度)
文檔教程知識庫【免費下載鏈接】til:memo: Today I Learned項目地址https://gitcode.com/gh_mirrors/ti/til點擊查看免費下載在 PostgreSQL 中age()函數(shù)是計算時間跨度的利器傳入單個時間戳即可得到從該時刻到現(xiàn)在的年齡如自 Y2K 以來過去了多久傳入兩個時間戳則可求出任意兩點之間以年、月、天為單位的時間差如某個人的壽命。本文以 postgres/determining-the-age-of-things.md 為主線結合本倉庫中關于 interval、timestamp 轉換與時序函數(shù)的多篇 TIL完整講解age()的兩種調(diào)用形式、返回值語義、輸入構造方式與實戰(zhàn)場景。age() 返回的是什么符號化的 intervalage()函數(shù)的返回值類型是 PostgreSQL 的interval。但它的特殊之處在于普通的時間減法如timestamp1 - timestamp2通常只以天 小數(shù)秒的形式給出結果而age()會輸出一種**符號化symbolic**的 interval——即把時間差拆解為X years Y mons Z days這種更接近人類閱讀習慣的表示這也正是本倉庫 postgres/determining-the-age-of-things.md 示例中輸出16 years 4 mons 12 days的原因。關于interval數(shù)據(jù)類型的更多定義方式可參考本倉庫 postgres/different-ways-to-define-an-interval.md既可以用interval 3 days關鍵字加字符串也可以3 days::interval強轉還可以通過make_interval(days 3)函數(shù)構造。理解interval的表示能力是正確解讀age()返回結果的前提。單參數(shù)形式age(timestamp) 計算距今時長age()最常用的是單參數(shù)形式——傳入一個時間戳返回從該時刻到當前時間的跨度。原文檔中給出的示例是計算自 Y2K2000 年 1 月 1 日以來已經(jīng)過去了多久 select age(timestamp 2000-01-01); age ------------------------- 16 years 4 mons 12 days這里timestamp 2000-01-01是 PostgreSQL 的標準時間戳字面量寫法類型關鍵字 字符串常量。age()會以當前日期為基準做減法輸出結果是符號化的 interval。在實際查詢中當前時間也可以顯式指定例如配合本倉庫 postgres/timestamp-functions.md 中介紹的now()等價于transaction_timestamp()表示當前事務開始時刻來對比驗證-- 結果隨當前時刻變化例如 select age(now() - interval 3 days); age ------------------ 3 days需要注意age(timestamp)的單參數(shù)形式是按日歷方式計算整年整月整天的差值而不是按固定的 24 小時一天來換算這正是它適合表達年齡這類概念的原因。雙參數(shù)形式age(timestamp1, timestamp2) 計算兩個時間點之差當我們需要計算任意兩個時間點之間的跨度時使用雙參數(shù)形式age(timestamp1, timestamp2)返回timestamp1減去timestamp2的結果輸出為X years Y mons Z days的形式。原文檔以美國歌手 Prince 為例——傳入死亡日期和出生日期計算其享年 select age(timestamp April 21, 2016, timestamp June 7, 1958); age -------------------------- 57 years 10 mons 14 days這里兩個時間戳都使用了自然語言風格的字符串字面量April 21, 2016PostgreSQL 的字符串解析器能夠識別這種表達并自動轉換為 timestamp 類型。輸出57 years 10 mons 14 days即為其實際壽命。參數(shù)順序與符號含義雙參數(shù)形式的語義是第一個參數(shù)減去第二個參數(shù)因此age(2016-04-21, 1958-06-07)得到正值后面的時間在后若兩個參數(shù)調(diào)換順序結果會變成負數(shù)如-57 years -10 mons -14 days這與 PostgreSQL 中時間減法保持一致的符號約定參數(shù)既可以是timestamp類型也可以是date類型會按需轉換只要保證兩個參數(shù)的類型可以參與差值運算。輸入時間戳的三種構造方式age()的兩個參數(shù)本質(zhì)上都需要解析為timestamp或可隱式轉換的類型。除原文檔展示的字符串字面量寫法如timestamp 2000-01-01外還有以下幾種常見構造方式。方式一ISO 8601 字符串直接強轉本倉庫 postgres/convert-a-string-to-a-timestamp.md 指出符合 ISO 8601 格式的字符串可以直接::timestamptz強轉 select 2018-10-24::timestamptz; timestamptz ------------------------ 2018-10-24 00:00:00-05這種形式同樣可以作為age()的參數(shù) select age(2018-10-24::timestamptz);方式二to_timestamp() 按模板解析任意格式當字符串不是標準 ISO 格式時可以使用to_timestamp(text, format)按格式模板解析 select to_timestamp(2018-10-24, YYYY-MM-DD); to_timestamp ------------------------ 2018-10-24 00:00:00-05第一個參數(shù)是待轉換的字符串第二個參數(shù)描述其格式。該方法對非標準輸入如April 21, 2016這類英文日期也能通過Month DD, YYYY模板可靠解析。方式三從列數(shù)據(jù)直接傳入實際業(yè)務中最常見的是直接傳入表中存儲的 timestamp/date 列例如計算用戶年齡、合同剩余天數(shù)select name, age(birth_date) as current_age from users;此時age(birth_date)直接復用單參數(shù)形式以當前日期為基準得出每位用戶的年齡配合WHERE條件即可篩選特定年齡段人群。實戰(zhàn)場景age() 的典型用法場景一計算記錄距今的時長結合本倉庫 postgres/timestamp-functions.md 中介紹的時間函數(shù)可以靈活地表達距今多久-- 訂單創(chuàng)建至今的時間跨度 select order_id, age(created_at) as age_of_order from orders order by created_at desc;場景二過濾指定時間跨度的記錄利用age()的返回值與interval比較可以過濾出超過 X 時間的記錄。例如找出注冊超過 1 年的用戶select * from users where age(created_at) interval 1 year;關于interval字面量的多種寫法詳見 postgres/different-ways-to-define-an-interval.md。場景三以年-月-天形式展示業(yè)務時長當需要向用戶展示入職 X 年 Y 個月這類人類可讀的時長時age()的符號化輸出正好符合需求免去手動按天數(shù)換算年月的麻煩。注意事項與邊界時間基準單參數(shù)age(timestamp)以當前日期本地時區(qū)為基準結果會隨時間推移而變化若需要固定基準請使用雙參數(shù)形式顯式傳入兩個時間戳。返回值不是純天數(shù)age()輸出的是年/月/天符號化結構直接做天數(shù)級別的算術比較時建議先將其與interval常量比較或使用EXTRACT(EPOCH FROM interval)轉成秒數(shù)。時區(qū)語義若使用帶時區(qū)的timestamptz差值計算基于時間點本身若使用無時區(qū)的timestamp則按會話時區(qū)的日歷語義計算。構造輸入時建議明確使用帶時區(qū)類型避免跨時區(qū)業(yè)務出現(xiàn)偏差參見 postgres/convert-a-string-to-a-timestamp.md 對timestamptz的說明。日期范圍輔助當需要同時表達一個時間段而非單一跨度時可參考 postgres/constructing-a-range-of-dates.md 中的daterange()函數(shù)它與age()共同構成了 PostgreSQL 處理時間域的兩類基本工具。小結age()是 PostgreSQL 中表達年齡和時間跨度最直觀的函數(shù)age(timestamp)從當前日期算起返回符號化 intervalage(timestamp1, timestamp2)返回兩時間點之差第一個減去第二個同樣以年-月-天呈現(xiàn)輸入支持字符串字面量、ISO 強轉、to_timestamp()模板解析以及表列數(shù)據(jù)等多種來源返回結果可與interval常量比較實現(xiàn)按時間跨度過濾等常見需求。完整示例可繼續(xù)閱讀本倉庫的 postgres/determining-the-age-of-things.md該文檔也是本倉庫 READMEREADME.mdPostgres 分類下列出的經(jīng)典 TIL 條目。贊分享文檔教程知識庫【免費下載鏈接】til:memo: Today I Learned項目地址https://gitcode.com/gh_mirrors/ti/til點擊查看免費下載相關推薦實測 Inpaint-web零安裝的瀏覽器圖像修復與在線圖片超分辨率實測 Inpaint web零安裝的瀏覽器圖像修復與在線圖片超分辨率 產(chǎn)品圖上的供應商水印你還要再開一次 Photoshopinpaint web 是一款圖像處理AI 應用前端StarRocks years_diff 函數(shù)詳解計算兩個日期/時間表達式之間的年份差StarRocks years_diff 函數(shù)詳解計算兩個日期/時間表達式之間的年份差 本篇技術指南圍繞 StarRocks 的 years_diff 日期時數(shù)據(jù)庫OLAP數(shù)據(jù)倉庫大數(shù)據(jù)湖倉一體數(shù)據(jù)分析Bumbler入門教程3分鐘學會追蹤Rails項目初始化加載進度Bumbler入門教程3分鐘學會追蹤Rails項目初始化加載進度 Bumbler是一款專為Bundler項目設計的加載進度追蹤工具能幫助開發(fā)者實時監(jiān)控Rai開發(fā)工具創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考