> 技术文档 > MYSQL_DATE_FORMAT()_函数_详解_mysql 日期格式化

MYSQL_DATE_FORMAT()_函数_详解_mysql 日期格式化

DATE_FORMAT() 是 MySQL 中最常用的日期时间格式化函数,它允许你按照指定的格式显示日期/时间值。

一、基本语法

sql

DATE_FORMAT(date, format)
  • date:有效的日期或时间表达式(如日期字段、NOW() 等)

  • format:定义输出格式的格式字符串

二、格式说明符大全

1. 年部分

说明符 描述 示例 %Y 四位数字年份 2023 %y 两位数字年份 23 %X 周所在的四位数年份(周日为一周的第一天) 2023 %x 周所在的四位数年份(周一为一周的第一天) 2023

2. 月部分

说明符 描述 示例 %m 两位数字月份(01-12) 05 %c 数字月份(1-12) 5 %M 完整的月份名称 May %b 缩写的月份名称 May

3. 日部分

说明符 描述 示例 %d 两位数字日(01-31) 15 %e 数字日(1-31) 15 %D 英文序数后缀的日 15th %j 一年中的天数(001-366) 135

4. 周部分

说明符 描述 示例 %W 完整的星期名称 Monday %a 缩写的星期名称 Mon %w 星期几的数字(0=周日) 1 %u 周数(00-53, 周日为一周的第一天) 20 %U 周数(00-53, 周一为一周的第一天) 20 %V 周数(01-53, 周日为一周的第一天) 20 %v 周数(01-53, 周一为一周的第一天) 20

5. 时间部分

说明符 描述 示例 %H 24小时制小时(00-23) 14 %k 24小时制小时(0-23) 14 %h 12小时制小时(01-12) 02 %I 12小时制小时(01-12) 02 %l 12小时制小时(1-12) 2 %i 分钟(00-59) 30 %S 秒(00-59) 45 %s 秒(00-59) 45 %f 微秒(000000-999999) 123456 %p AM或PM PM %r 12小时制时间(hh:mm:ss AM/PM) 02:30:45 PM %T 24小时制时间(hh:mm:ss) 14:30:45

6. 其他格式

说明符 描述 示例 %% 百分号字符 % %x 日期字符串 2023-05-15

三、实用示例

1. 基础格式化

sql

-- 标准日期时间格式SELECT DATE_FORMAT(NOW(), \'%Y-%m-%d %H:%i:%s\') AS formatted_datetime;-- 中文日期格式SELECT DATE_FORMAT(NOW(), \'%Y年%m月%d日\') AS chinese_date;-- 美国日期格式SELECT DATE_FORMAT(NOW(), \'%m/%d/%Y\') AS us_date;-- 带星期的时间格式SELECT DATE_FORMAT(NOW(), \'%W, %M %d, %Y %h:%i %p\') AS full_format;

2. 表格数据格式化

sql

-- 格式化表中的日期字段SELECT id, DATE_FORMAT(created_at, \'%Y-%m-%d\') AS create_date, DATE_FORMAT(updated_at, \'%H:%i:%s\') AS update_timeFROM users;

3. 条件格式化

sql

-- 根据不同条件使用不同格式SELECT id, CASE WHEN DATE(created_at) = CURDATE() THEN DATE_FORMAT(created_at, \'今天 %H:%i\') ELSE DATE_FORMAT(created_at, \'%Y-%m-%d\') END AS display_timeFROM orders;

四、性能考虑

  1. 索引使用:在 WHERE 子句中对日期字段使用 DATE_FORMAT() 会导致索引失效

    sql

    -- 不推荐(索引失效)SELECT * FROM orders WHERE DATE_FORMAT(created_at, \'%Y-%m-%d\') = \'2023-05-15\';-- 推荐(可以使用索引)SELECT * FROM orders WHERE created_at BETWEEN \'2023-05-15 00:00:00\' AND \'2023-05-15 23:59:59\';
  2. 存储格式化值:如需频繁使用特定格式,可考虑新增一个计算列

    sql

    ALTER TABLE orders ADD COLUMN create_date_str VARCHAR(10) GENERATED ALWAYS AS (DATE_FORMAT(created_at, \'%Y-%m-%d\')) STORED;

五、与其他函数的结合

sql

-- 与CONCAT结合SELECT CONCAT(\'订单创建于: \', DATE_FORMAT(created_at, \'%Y年%m月%d日\')) AS order_infoFROM orders;-- 与DATE_ADD/DATE_SUB结合SELECT DATE_FORMAT(DATE_ADD(NOW(), INTERVAL 7 DAY), \'%Y-%m-%d\') AS next_week;

六、注意事项

  1. NULL 值处理:如果日期参数为 NULL,函数返回 NULL

  2. 无效格式:如果格式字符串无效,MySQL 会返回错误

  3. 时区影响:格式化结果受 MySQL 时区设置影响

  4. 语言环境:月份和星期名称的显示取决于系统的 lc_time_names 变量

服装设计字体库