以下是SQL中常用時間操作函數的匯總,按功能分類整理,結合多個權威來源內容綜合而成:
一、獲取當前時間
函數名稱 | 功能說明 | 示例 | 適用數據庫 |
---|---|---|---|
CURDATE() | 獲取當前日期(不含時間) | SELECT CURDATE(); → 2024-08-21 | MySQL, MariaDB |
CURRENT_DATE() | 同CURDATE() (標準SQL) | SELECT CURRENT_DATE; | 多數數據庫 |
NOW() | 獲取當前日期和時間 | SELECT NOW(); → 2024-08-21 10:41:41 | MySQL, SQL Server |
GETDATE() | 獲取當前日期時間(SQL Server專用) | SELECT GETDATE(); | SQL Server |
CURRENT_TIMESTAMP | 獲取當前時間戳(帶時區) | SELECT CURRENT_TIMESTAMP; | PostgreSQL, Oracle |
二、提取時間部分
函數名稱 | 功能說明 | 示例 | 適用數據庫 |
---|---|---|---|
YEAR(date) | 提取年份 | YEAR('2024-08-21') → 2024 | MySQL, SQL Server |
MONTH(date) | 提取月份(1-12) | MONTH('2024-08-21') → 8 | 通用 |
DAY(date) | 提取日(1-31) | DAY('2024-08-21') → 21 | 通用 |
HOUR(time) | 提取小時(0-23) | HOUR('10:41:41') → 10 | MySQL, SQL Server |
MINUTE(time) | 提取分鐘(0-59) | MINUTE('10:41:41') → 41 | 通用 |
SECOND(time) | 提取秒(0-59) | SECOND('10:41:41') → 41 | 通用 |
EXTRACT(unit FROM date) | 靈活提取指定部分(年/月/日等) | EXTRACT(YEAR FROM '2024-08-21') → 2024 | PostgreSQL, MySQL |
三、時間計算與操作
函數名稱 | 功能說明 | 示例 | 適用數據庫 |
---|---|---|---|
DATE_ADD(date, INTERVAL expr unit) | 日期增加指定時間間隔 | DATE_ADD('2024-08-21', INTERVAL 7 DAY) → 2024-08-28 | MySQL |
DATE_SUB(date, INTERVAL expr unit) | 日期減去指定時間間隔 | DATE_SUB('2024-08-21', INTERVAL 1 MONTH) → 2024-07-21 | MySQL |
DATEDIFF(date1, date2) | 計算兩個日期相差的天數 | DATEDIFF('2024-08-21', '2024-08-01') → 20 | MySQL, SQL Server |
TIMESTAMPDIFF(unit, start, end) | 按單位計算時間差(天/小時等) | TIMESTAMPDIFF(DAY, '2024-08-01', '2024-08-21') → 20 | MySQL |
ADDDATE(date, days) | 日期增加指定天數 | ADDDATE('2024-08-21', 7) → 2024-08-28 | MySQL |
四、時間格式化與轉換
函數名稱 | 功能說明 | 示例 | 適用數據庫 |
---|---|---|---|
DATE_FORMAT(date, format) | 按指定格式輸出日期 | DATE_FORMAT('2024-08-21', '%Y年%m月%d日') → 2024年08月21日 | MySQL |
TO_CHAR(date, format) | 日期轉字符串(PostgreSQL/Oracle) | TO_CHAR('2024-08-21', 'YYYY-MM-DD') → 2024-08-21 | PostgreSQL, Oracle |
STR_TO_DATE(str, format) | 字符串轉日期 | STR_TO_DATE('2024年08月21日', '%Y年%m月%d日') → 2024-08-21 | MySQL |
UNIX_TIMESTAMP(date) | 日期轉Unix時間戳 | UNIX_TIMESTAMP('2024-08-21') → 1724208000 | MySQL |
FROM_UNIXTIME(unixtime) | Unix時間戳轉日期 | FROM_UNIXTIME(1724208000) → 2024-08-21 00:00:00 | MySQL |
五、實用場景函數
- 查詢今天數據
SELECT * FROM orders WHERE DATE(created_at) = CURDATE();
- 查詢昨天數據
SELECT * FROM orders WHERE DATE(created_at) = DATE_SUB(CURDATE(), INTERVAL 1 DAY);
- 查詢未來7天數據
SELECT * FROM events WHERE event_date BETWEEN CURDATE() AND DATE_ADD(CURDATE(), INTERVAL 7 DAY);
- 計算工齡(年)
SELECT TIMESTAMPDIFF(YEAR, hire_date, CURDATE()) AS years_of_service FROM employees;
關鍵注意事項
- 數據庫差異
- SQL Server使用
GETDATE()
而非NOW()
,日期加減用DATEADD()
/DATEDIFF()
。 - Oracle使用
SYSDATE
獲取當前時間,TO_DATE()
轉換字符串。
- SQL Server使用
- 時區處理
CURRENT_TIMESTAMP
返回帶時區的時間,需結合CONVERT_TZ()
轉換時區(MySQL)。
- 性能優化
- 避免在
WHERE
條件中對列使用函數(如YEAR(date)=2024
),可能導致索引失效。
- 避免在
完整函數列表及語法細節可參考:MySQL日期函數文檔、SQL Server時間函數。
以上內容由AI生成,僅供參考和借鑒