Skip to content

DATE_FORMAT() 函数用于将日期/时间值格式化为指定的字符串格式。以下是详细使用方法:

基本语法

sql
DATE_FORMAT(date, format)
  • date:要格式化的日期/时间值
  • format:格式字符串,定义输出格式

常用格式符号

格式符描述示例
%Y4位年份2023
%y2位年份23
%m月份(01-1207
%c月份(1-12)7
%M月份名称July
%b缩写月份Jul
%d日期(01-3115
%e日期(1-31)15
%H24小时制(00-23)14
%h12小时制(01-12)02
%i分钟(00-59)05
%s秒(00-59)30
%pAM/PMPM
%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() 配合字符串拼接。

版权声明