MySQL DATE() 函數 (從 DATETIME 取出日期部分)

DATE() 是 MySQL 中用來從日期時間值中取出日期部分的函數。它會忽略時間部分,只返回日期,格式為 YYYY-MM-DD

DATE() 語法 (Syntax)

DATE(expression)
  • expression:日期或日期時間表達式,可以是 DATE、DATETIME、TIMESTAMP 類型,或是有效的日期時間字串。

DATE() 函數用法範例 (Example)

基本用法

SELECT DATE('2024-12-31 23:59:59');
-- 結果:2024-12-31

SELECT DATE('2024-11-22 14:30:45');
-- 結果:2024-11-22

SELECT DATE(NOW());
-- 結果:2024-11-22(當天日期)

從 DATETIME 欄位取出日期

假設有一個 orders 資料表,其中 order_date 欄位是 DATETIME 類型:

SELECT 
    order_id,
    order_date,
    DATE(order_date) AS order_date_only
FROM orders;
order_idorder_dateorder_date_only
12024-11-22 10:30:002024-11-22
22024-11-22 15:45:302024-11-22
32024-11-23 09:00:002024-11-23

按日期篩選記錄

order_date 欄位包含時間部分時,使用 DATE() 函數可以忽略時間進行比較:

-- 取得特定日期的所有訂單(不論時間)
SELECT * FROM orders 
WHERE DATE(order_date) = '2024-11-22';

-- 這比以下方式更簡潔:
-- WHERE order_date >= '2024-11-22 00:00:00' AND order_date < '2024-11-23 00:00:00'

按日期分組統計

-- 統計每天的訂單數量
SELECT 
    DATE(order_date) AS order_day,
    COUNT(*) AS order_count,
    SUM(amount) AS total_amount
FROM orders
GROUP BY DATE(order_date)
ORDER BY order_day DESC;

取得今天的記錄

SELECT * FROM orders 
WHERE DATE(order_date) = CURDATE();

DATE() 與其他日期函數的配合

-- 取出年、月、日
SELECT 
    DATE(NOW()) AS date_only,
    YEAR(NOW()) AS year_part,
    MONTH(NOW()) AS month_part,
    DAY(NOW()) AS day_part;
-- 結果:2024-11-22, 2024, 11, 22

效能注意事項

WHERE 子句中對欄位使用函數(如 DATE(order_date))可能會導致索引無法使用,影響查詢效能。對於大型資料表,建議使用範圍條件:

-- 效能較差(無法使用 order_date 的索引)
SELECT * FROM orders WHERE DATE(order_date) = '2024-11-22';

-- 效能較好(可以使用 order_date 的索引)
SELECT * FROM orders 
WHERE order_date >= '2024-11-22' AND order_date < '2024-11-23';

如果需要頻繁按日期查詢,可以考慮新增一個只儲存日期的欄位並建立索引。

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