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_id | order_date | order_date_only |
|---|---|---|
| 1 | 2024-11-22 10:30:00 | 2024-11-22 |
| 2 | 2024-11-22 15:45:30 | 2024-11-22 |
| 3 | 2024-11-23 09:00:00 | 2024-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';
如果需要頻繁按日期查詢,可以考慮新增一個只儲存日期的欄位並建立索引。