日期資料型態 (SQL Date Data Types)
這篇 SQL 日期函數教學介紹資料庫中常用的日期資料型態與日期函數。一般資料庫都有提供表示日期的資料型態 (Date Data Types),搭配 SELECT 語句可以靈活查詢日期相關資料。
MySQL 日期資料型態
MySQL 中常用的日期資料型態如下:
| 資料型態 | 格式 | 說明 |
|---|---|---|
| DATE | YYYY-MM-DD | 日期 |
| DATETIME | YYYY-MM-DD HH:MI:SS | 日期與時間 |
| TIMESTAMP | YYYY-MM-DD HH:MI:SS | 時間戳記 |
| YEAR | YYYY 或 YY | 年份 |
SQL Date 函數 (SQL Date Functions)
以下是一些常用的 SQL 日期函數:
| 函數 | 說明 |
|---|---|
| NOW() | 返回目前的日期與時間 |
| CURDATE() | 返回目前的日期 |
| CURTIME() | 返回目前的時間 |
| DATE() | 提取日期部分 |
| YEAR() | 提取年份 |
| MONTH() | 提取月份 |
| DAY() | 提取日 |
日期函數用法 (Example)
假設我們有一個訂單資料表 orders 如下(若需了解如何建立資料表,請參考 CREATE TABLE 教學):
| OrderId | ProductName | OrderDate |
|---|---|---|
| 1 | 蘋果 | 2024-11-01 |
| 2 | 香蕉 | 2024-11-15 |
| 3 | 橘子 | 2024-12-01 |
我們可以使用 DATE 函數搭配 WHERE 子句來查詢特定日期的訂單:
SELECT * FROM orders
WHERE DATE(OrderDate) = '2024-11-01';
查詢結果如下:
| OrderId | ProductName | OrderDate |
|---|---|---|
| 1 | 蘋果 | 2024-11-01 |
各資料庫日期函數差異 (Date Functions Across Databases)
不同的資料庫系統在日期函數的語法上有所差異,以下整理了 MySQL、SQL Server、PostgreSQL 和 Oracle 中常用的日期操作函數,幫助你在不同資料庫環境下靈活運用。
日期格式化 (Date Formatting)
將日期轉換為指定格式的字串,各資料庫的語法如下:
| 資料庫 | 語法 | 範例 |
|---|---|---|
| MySQL | DATE_FORMAT(date, format) | DATE_FORMAT(NOW(), ‘%Y-%m-%d’) |
| SQL Server | FORMAT(date, format) | FORMAT(GETDATE(), ‘yyyy-MM-dd’) |
| PostgreSQL | TO_CHAR(date, format) | TO_CHAR(NOW(), ‘YYYY-MM-DD’) |
| Oracle | TO_CHAR(date, format) | TO_CHAR(SYSDATE, ‘YYYY-MM-DD’) |
以 MySQL 為例,使用 DATE_FORMAT 將訂單日期格式化為「年/月」的格式:
SELECT ProductName, DATE_FORMAT(OrderDate, '%Y/%m') AS FormattedDate
FROM orders;
查詢結果如下:
| ProductName | FormattedDate |
|---|---|
| 蘋果 | 2024/11 |
| 香蕉 | 2024/11 |
| 橘子 | 2024/12 |
日期加減運算 (Date Addition)
在日期上加上或減去一段時間間隔,各資料庫的語法差異較大:
| 資料庫 | 語法 | 加 7 天的範例 |
|---|---|---|
| MySQL | DATE_ADD(date, INTERVAL n unit) | DATE_ADD(‘2024-11-01’, INTERVAL 7 DAY) |
| SQL Server | DATEADD(unit, n, date) | DATEADD(DAY, 7, ‘2024-11-01’) |
| PostgreSQL | date + INTERVAL ‘n unit’ | ‘2024-11-01’::date + INTERVAL ‘7 days’ |
| Oracle | date + n(天數) | TO_DATE(‘2024-11-01’, ‘YYYY-MM-DD’) + 7 |
以 MySQL 為例,查詢每筆訂單 7 天後的日期:
SELECT ProductName, OrderDate,
DATE_ADD(OrderDate, INTERVAL 7 DAY) AS DeliveryDate
FROM orders;
查詢結果如下:
| ProductName | OrderDate | DeliveryDate |
|---|---|---|
| 蘋果 | 2024-11-01 | 2024-11-08 |
| 香蕉 | 2024-11-15 | 2024-11-22 |
| 橘子 | 2024-12-01 | 2024-12-08 |
日期差異計算 (Date Difference)
計算兩個日期之間的差異,各資料庫的寫法也不盡相同:
| 資料庫 | 語法 | 說明 |
|---|---|---|
| MySQL | DATEDIFF(date1, date2) | 回傳天數差(date1 – date2) |
| SQL Server | DATEDIFF(unit, start, end) | 可指定回傳單位(DAY、MONTH、YEAR 等) |
| PostgreSQL | date1 – date2 | 直接相減,回傳天數 |
| Oracle | date1 – date2 | 直接相減,回傳天數(含小數) |
以 MySQL 為例,計算每筆訂單距離今天過了幾天:
SELECT ProductName, OrderDate,
DATEDIFF(CURDATE(), OrderDate) AS DaysAgo
FROM orders;
了解各資料庫之間日期函數的差異,可以幫助你在切換不同資料庫環境時更快速地撰寫正確的 SQL 語句。建議在開發時先確認目標資料庫的日期函數語法,避免因語法差異導致查詢錯誤。