PostgreSQL - 日期/時間函數與操作符

Hello, 有志的程序员們!今天,我們將踏上一段令人興奮的旅程,探索 PostgreSQL 中的日期和時間世界。作為你們友好的鄰居計算機科學老師,我將帶著過去 15 年教學的熱情來指導你們這些概念。所以,拿起你的虛擬筆記本,讓我們一起來看看吧!

Date/Time Functions & Operators

了解 PostgreSQL 中的日期和時間

在我們開始探索函數和操作符之前,讓我們花一會兒時間了解一下為什麼日期和時間在編程中如此重要。想像一下你正在建造一臺時間機(這不是很酷嗎?)你需要知道你現在在哪裡,以及(或當)你想去哪裡。這就是我們在數據庫中做的事情——我們追踪事情發生的時間,它們持續多久,甚至預測未來的事件。

現在,讓我們看看 PostgreSQL 中一些最有用的日期和時間函數。

AGE(timestamp, timestamp) 和 AGE(timestamp)

AGE 函數就像那個總是記得事情發生多久了的朋友。它計算兩個時間戳之間或時間戳與當前日期之間的差異。

示例 1:計算年齡

SELECT AGE(TIMESTAMP '2023-05-15', TIMESTAMP '1990-01-01');

這將返回類似於以下內容:

33 年 4 個月 14 天

這裡發生了什麼?我們請求 PostgreSQL 計算 1990 年 1 月 1 日和 2023 年 5 月 15 日之間的時間差。這就像問,“如果某人在 1990 年 1 月 1 日出生,他會有多大年紀?”

示例 2:從當前日期計算年齡

SELECT AGE(TIMESTAMP '1990-01-01');

這將返回 1990 年 1 月 1 日與當前日期之間的時間差。這就像問,“1990 年 1 月 1 日出生的某人現在多大年紀?”

CURRENT DATE/TIME 函數

這些函數就像你數據庫內置的時鐘和日曆。它們告訴你現在是什麼時間。

示例 3:獲取當前日期和時間

SELECT CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP;

這將返回今天的日期、當前時間和兩者的組合。這就像問你的數據庫,“今天是什麼日子,現在是什麼時間,以及現在的確切時刻是什麼?”

DATE_PART 和 DATE_TRUNC 函數

DATE_PART 像是一臺時間機器,可以放大特定日期或時間的部分。DATE_TRUNC 則像是一個時間簡化器——它將時間降低到指定時間單位。

示例 4:提取日期的部分

SELECT DATE_PART('year', TIMESTAMP '2023-05-15 10:30:00');
SELECT DATE_PART('hour', TIMESTAMP '2023-05-15 10:30:00');

第一個查詢將返回 2023,第二個將返回 10。這就像問,“這個時間戳是哪一年的?”和“這個時間戳是白天還是晚上?”

示例 5:截斷時間戳

SELECT DATE_TRUNC('hour', TIMESTAMP '2023-05-15 10:30:00');

這將返回 '2023-05-15 10:00:00'。這就像說,“給我這個時間戳,但是將分鐘和秒數重置為零。”

EXTRACT 函數

EXTRACT 與 DATE_PART 相似,但語法略有不同。這是另一種提取日期或時間特定部分的方法。

示例 6:從時間戳中提取

SELECT EXTRACT(YEAR FROM TIMESTAMP '2023-05-15 10:30:00');
SELECT EXTRACT(HOUR FROM TIMESTAMP '2023-05-15 10:30:00');

這些查詢將分別返回 2023 和 10,與我們的 DATE_PART 示例一樣。

ISFINITE 函數

這些函數就像你數據庫的現實檢查。它們告訴你一個日期、時間戳或間隔是否是一個真實的、有限的值,或者它是一個特殊的无窮大值。

示例 7:檢查有限性

SELECT ISFINITE(DATE '2023-05-15');
SELECT ISFINITE(TIMESTAMP 'infinity');

第一個查詢將返回 true,而第二個將返回 false。這就像問,“2023 年 5 月 15 日是一個真實的日期嗎?”(是的)和“無窮大是一個真實的時間戳嗎?”(不是)。

JUSTIFY 函數

這些函數就像你數據庫的時間調整器。它們將可能有一些奇怪值的間隔調整為更標準的表示形式。

示例 8:調整間隔

SELECT JUSTIFY_DAYS(INTERVAL '30 days');
SELECT JUSTIFY_HOURS(INTERVAL '36 hours');
SELECT JUSTIFY_INTERVAL(INTERVAL '1 month 36 hours');

這些可能返回:

1 個月
1 天 12 個小時
1 個月 1 天 12 個小時

這就像說,“將這些時間段表達得更標準一點。”

函數總結

這裡是一個便捷的表格,總結了我們討論的所有函數:

函數 描述
AGE() 計算時間戳之間的差異
CURRENT_DATE 返回當前日期
CURRENT_TIME 返回當前時間
CURRENT_TIMESTAMP 返回當前日期和時間
DATE_PART() 從日期/時間中提取特定部分
DATE_TRUNC() 將時間戳截斷到指定精確度
EXTRACT() 從日期/時間中提取特定字段
ISFINITE() 檢查日期/時間/間隔是否有限
JUSTIFY_DAYS() 調整間隔中的天數
JUSTIFY_HOURS() 調整間隔中的小時數
JUSTIFY_INTERVAL() 調整整個間隔

這就是全部了,各位!我們一起穿越了時間(函數),提取了日期的片段,檢查了無窮大的有限性,甚至調整了間隔。記住,在數據庫中處理日期和時間對於許多應用程序來說是至關重要的,從跟蹤用戶活動到排程事件。

在你繼續編程旅程的過程中,你會發現這些函數非常有用。它們就像是數據庫工具箱中時間操作的多功能工具。持續練習,持續探索,不久之後,你將成為數據庫世界的時間領主!

Credits: Image by storyset