MySQL EXTRACT() 函數 (取出日期時間中特定的部分)
EXTRACT() 是 MySQL 中用來從日期時間值中取出特定部分的函數,例如年、月、日、時、分、秒等。它是標準 SQL 的一部分,因此在其他資料庫(如 PostgreSQL、Oracle)中也可以使用。
EXTRACT() 語法 (Syntax)
EXTRACT(unit FROM datetime)
- unit:要取出的日期時間部分(見下方表格)。
- datetime:日期或日期時間表達式。
unit 可用的值
| unit | 說明 | 範例值 |
|---|---|---|
| MICROSECOND | 微秒 | 0-999999 |
| SECOND | 秒 | 0-59 |
| MINUTE | 分鐘 | 0-59 |
| HOUR | 小時 | 0-23 |
| DAY | 日 | 1-31 |
| WEEK | 週(一年中的第幾週) | 0-53 |
| MONTH | 月 | 1-12 |
| QUARTER | 季度 | 1-4 |
| YEAR | 年 | 1000-9999 |
| SECOND_MICROSECOND | 秒和微秒 | 'SS.MMMMMM' |
| MINUTE_MICROSECOND | 分、秒和微秒 | 'MM:SS.MMMMMM' |
| MINUTE_SECOND | 分和秒 | 'MM:SS' |
| HOUR_MICROSECOND | 時、分、秒和微秒 | 'HH:MM:SS.MMMMMM' |
| HOUR_SECOND | 時、分和秒 | 'HH:MM:SS' |
| HOUR_MINUTE | 時和分 | 'HH:MM' |
| DAY_MICROSECOND | 日、時、分、秒和微秒 | 'DD HH:MM:SS.MMMMMM' |
| DAY_SECOND | 日、時、分和秒 | 'DD HH:MM:SS' |
| DAY_MINUTE | 日、時和分 | 'DD HH:MM' |
| DAY_HOUR | 日和時 | 'DD HH' |
| YEAR_MONTH | 年和月 | 'YYYY-MM' |
EXTRACT() 函數用法範例 (Example)
取出年份
SELECT EXTRACT(YEAR FROM '2024-07-15');
-- 結果:2024
SELECT EXTRACT(YEAR FROM NOW());
-- 結果:2024(當前年份)
取出月份
SELECT EXTRACT(MONTH FROM '2024-07-15 10:30:45');
-- 結果:7
取出日期
SELECT EXTRACT(DAY FROM '2024-07-15 10:30:45');
-- 結果:15
取出小時
SELECT EXTRACT(HOUR FROM '2024-07-15 10:30:45');
-- 結果:10
取出分鐘
SELECT EXTRACT(MINUTE FROM '2024-07-15 10:30:45');
-- 結果:30
取出秒鐘
SELECT EXTRACT(SECOND FROM '2024-07-15 10:30:45');
-- 結果:45
取出季度
SELECT EXTRACT(QUARTER FROM '2024-07-15');
-- 結果:3(7 月是第 3 季)
SELECT EXTRACT(QUARTER FROM '2024-01-15');
-- 結果:1(1 月是第 1 季)
取出週數
SELECT EXTRACT(WEEK FROM '2024-07-15');
-- 結果:28(一年中的第 28 週)
實際應用範例
按年份統計訂單
SELECT
EXTRACT(YEAR FROM order_date) AS order_year,
COUNT(*) AS order_count
FROM orders
GROUP BY EXTRACT(YEAR FROM order_date)
ORDER BY order_year;
按月份統計訂單
SELECT
EXTRACT(YEAR FROM order_date) AS year,
EXTRACT(MONTH FROM order_date) AS month,
COUNT(*) AS order_count
FROM orders
GROUP BY
EXTRACT(YEAR FROM order_date),
EXTRACT(MONTH FROM order_date)
ORDER BY year, month;
按季度統計銷售額
SELECT
EXTRACT(YEAR FROM order_date) AS year,
EXTRACT(QUARTER FROM order_date) AS quarter,
SUM(amount) AS total_sales
FROM orders
GROUP BY
EXTRACT(YEAR FROM order_date),
EXTRACT(QUARTER FROM order_date)
ORDER BY year, quarter;
篩選特定月份的記錄
-- 取得所有 7 月的訂單(不限年份)
SELECT * FROM orders
WHERE EXTRACT(MONTH FROM order_date) = 7;
按小時分析訂單分佈
SELECT
EXTRACT(HOUR FROM order_date) AS order_hour,
COUNT(*) AS order_count
FROM orders
GROUP BY EXTRACT(HOUR FROM order_date)
ORDER BY order_hour;
EXTRACT() 與其他日期函數的比較
MySQL 也提供了 YEAR()、MONTH()、DAY() 等專用函數,功能與 EXTRACT() 相同:
-- 以下兩種寫法結果相同
SELECT EXTRACT(YEAR FROM '2024-07-15'); -- 結果:2024
SELECT YEAR('2024-07-15'); -- 結果:2024
SELECT EXTRACT(MONTH FROM '2024-07-15'); -- 結果:7
SELECT MONTH('2024-07-15'); -- 結果:7
SELECT EXTRACT(DAY FROM '2024-07-15'); -- 結果:15
SELECT DAY('2024-07-15'); -- 結果:15
EXTRACT() 的優點是:
- 標準 SQL 語法,跨資料庫相容性較好
- 語法更一致,只需記住一個函數