MySQL EXTRACT() 函數 (取出日期時間中特定的部分)

EXTRACT() 是 MySQL 中用來從日期時間值中取出特定部分的函數,例如年、月、日、時、分、秒等。它是標準 SQL 的一部分,因此在其他資料庫(如 PostgreSQL、Oracle)中也可以使用。

EXTRACT() 語法 (Syntax)

EXTRACT(unit FROM datetime)
  • unit:要取出的日期時間部分(見下方表格)。
  • datetime:日期或日期時間表達式。

unit 可用的值

unit說明範例值
MICROSECOND微秒0-999999
SECOND0-59
MINUTE分鐘0-59
HOUR小時0-23
DAY1-31
WEEK週(一年中的第幾週)0-53
MONTH1-12
QUARTER季度1-4
YEAR1000-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 語法,跨資料庫相容性較好
  • 語法更一致,只需記住一個函數

更多 MySQL 相關的日期時間函數在這邊
更多 SQL Server 相關的日期時間函數在這邊