DATE_FORMAT() 函数用于将日期/时间值格式化为指定的字符串格式。以下是详细使用方法:
基本语法
sql
DATE_FORMAT(date, format)- date:要格式化的日期/时间值
- format:格式字符串,定义输出格式
常用格式符号
| 格式符 | 描述 | 示例 |
|---|---|---|
| %Y | 4位年份 | 2023 |
| %y | 2位年份 | 23 |
| %m | 月份(01-12 | 07 |
| %c | 月份(1-12) | 7 |
| %M | 月份名称 | July |
| %b | 缩写月份 | Jul |
| %d | 日期(01-31 | 15 |
| %e | 日期(1-31) | 15 |
| %H | 24小时制(00-23) | 14 |
| %h | 12小时制(01-12) | 02 |
| %i | 分钟(00-59) | 05 |
| %s | 秒(00-59) | 30 |
| %p | AM/PM | PM |
| %W | 星期名称 | Monday |
| %a | 缩写星期 | Mon |
| %w | 星期几(0=周日) | 1 |
实际示例
sql
-- 创建测试表
CREATE TABLE orders (
id INT,
order_date DATETIME
);
INSERT INTO orders VALUES
(1, '2023-07-15 14:30:45'),
(2, '2024-12-25 09:15:20');
-- 示例查询
SELECT
order_date,
-- 美国日期格式
DATE_FORMAT(order_date, '%m/%d/%Y') AS us_date,
-- 欧洲日期格式
DATE_FORMAT(order_date, '%d/%m/%Y') AS eu_date,
-- 完整日期时间
DATE_FORMAT(order_date, '%Y年%m月%d日 %H:%i:%s') AS full_datetime,
-- 带星期几
DATE_FORMAT(order_date, '%Y-%m-%d %W') AS with_weekday,
-- 12小时制
DATE_FORMAT(order_date, '%Y-%m-%d %h:%i:%s %p') AS am_pm_format,
-- 仅时间部分
DATE_FORMAT(order_date, '%H:%i:%s') AS time_only,
-- 季度表示
CONCAT(DATE_FORMAT(order_date, '%Y'), 'Q', QUARTER(order_date)) AS quarter,
-- 自定义友好格式
DATE_FORMAT(order_date, '%M %e, %Y at %l:%i %p') AS friendly_format
FROM orders;常见应用场景
1. 报表格式化
sql
-- 按月统计订单
SELECT
DATE_FORMAT(order_date, '%Y-%m') AS month,
COUNT(*) AS order_count
FROM orders
GROUP BY DATE_FORMAT(order_date, '%Y-%m')
ORDER BY month;2. 条件查询
sql
-- 查询2023年7月的订单
SELECT *
FROM orders
WHERE DATE_FORMAT(order_date, '%Y-%m') = '2023-07';
-- 查询星期一的订单
SELECT *
FROM orders
WHERE DATE_FORMAT(order_date, '%W') = 'Monday';3. 组合使用
sql
-- 创建报表标题
SELECT
CONCAT(
'报表周期: ',
DATE_FORMAT(MIN(order_date), '%Y/%m/%d'),
' 至 ',
DATE_FORMAT(MAX(order_date), '%Y/%m/%d')
) AS report_period
FROM orders;注意事项
- 1.性能考虑:在 WHERE 子句中使用 DATE_FORMAT() 可能会导致索引失效
sql
-- 不推荐(索引可能失效)
SELECT * FROM orders WHERE DATE_FORMAT(order_date, '%Y-%m') = '2023-07';
-- 推荐(可以使用索引)
SELECT * FROM orders
WHERE order_date >= '2023-07-01'
AND order_date < '2023-08-01';- 2.NULL 值处理:如果日期为 NULL,DATE_FORMAT() 返回 NULL
sql
SELECT DATE_FORMAT(NULL, '%Y-%m-%d'); -- 返回 NULL- 与 STR_TO_DATE() 配合使用
sql
-- 字符串转日期
SELECT STR_TO_DATE('15-07-2023', '%d-%m-%Y');
-- 格式化后再解析
SELECT DATE_FORMAT(
STR_TO_DATE('15-07-2023', '%d-%m-%Y'),
'%Y/%m/%d'
); -- 返回 '2023/07/15'-不同数据库的差异
- MySQL/MariaDB:使用 DATE_FORMAT() 函数
- SQL Server:使用 FORMAT() 函数或 CONVERT()
- Oracle:使用 TO_CHAR() 函数
- PostgreSQL:使用 TO_CHAR() 函数
- 如果需要跨数据库兼容,建议使用标准 SQL 函数如 EXTRACT() 配合字符串拼接。