HOWTO · PostgreSQL

如何在 PostgreSQL 時間戳中減去一天

說明如何使用 INTERVAL 從 PostgreSQL 時間戳減去一天;若只需要日期,可先轉型為 DATE 再相減。

本頁內容

若要從 PostgreSQL 時間戳減去一天並保留一天中的時間,請減去 INTERVAL 值:SELECT TIMESTAMP '2021-01-01 08:08:01' - INTERVAL '1 DAY';。結果為 2020-12-31 08:08:01。若只需要日期,可先轉型為 DATE,捨去時間部分再計算。以下是 PostgreSQL SQL 範例;執行需要 PostgreSQL 伺服器,因此這裡不將結果描述為經過執行測試。

使用 INTERVAL 從 PostgreSQL 時間戳減去一天

若結果應保留為時間戳,請使用 INTERVAL '1 DAY'。例如,SELECT TIMESTAMP '2021-01-01 08:08:01' - INTERVAL '1 DAY'; 會從指定的時間戳減去一天。在這個例子中,日期會變成前一個日曆日期,而時間部分仍是 08:08:01。

interval 表示一段時間,PostgreSQL 可以將它加到日期或時間戳值上,也可以從這些值中減去。在此查詢中,interval 為一天。這個運算式以輸入的時間戳為準,不受目前日期或時間影響。若要對資料表中的資料執行相同運算,可將時間戳常值換成時間戳欄位或參數;例如,created_at - INTERVAL '1 DAY' 會為每一列計算早一天的時間戳。

不要直接從時間戳減去整數。例如,TIMESTAMP '2021-01-01 08:08:01' - 1 沒有相對應的時間戳減整數運算。若結果必須保留一天中的時間,請使用 interval。若只需要日期,請先將時間戳轉型為 DATE,再減去整數,如下一節所示。

從時間戳的日期部分減去一天

轉型為 DATE 會在相減前移除一天中的時間。例如,SELECT TIMESTAMP '2021-01-01 08:08:01'::DATE - 1; 會傳回 2020-12-31。結果是日期而非時間戳,因此不會保留原本的 08:08:01。

若時間戳欄位記錄事件時間,但計算目的是取得日期標籤或報表日期,這種做法就很實用。只有在確定要捨去時間時才進行轉型。若後續程式仍需要原本的時刻,請改為從時間戳減去 interval。也可以對欄位進行轉型和相減,例如 event_time::DATE - 1。

從 PostgreSQL 日期減去一天

若值本身已是 PostgreSQL DATE,可減去代表天數的整數:SELECT DATE '2021-01-01' - 1; 會傳回 2020-12-31。此處的整數代表天數,因此 - 7 會將日期往前推七天。結果仍是 DATE。

請依據值的型別和所需結果選擇運算方式:使用 timestamp - INTERVAL '1 DAY' 保留時間戳資料;使用 timestamp::DATE - 1 從時間戳取得日期;若原值已是日期,則使用 date - 1。PostgreSQL 的日期運算會依日曆計算結果日期,不需要自行計算每個月份的天數。範例使用固定常值,讓輸入與結果一目了然。若在資料表查詢中使用,請換成相關欄位,並依欄位型別選用 interval 或整數運算。