前言
学会字符串函数后,做业务报表、数据统计又卡在日期时间处理:
- 数据库存的datetime 格式看不懂 ,想转成
yyyy-MM-dd不会格式化; - 需要统计近 7 天、近 30 天数据,不会做日期加减;
- 单独提取年份、月份、日期、小时,不知道用什么函数;
- 时间字段没法按日、按月、按季度分组统计,日报周报写不出来;
- 面试常考:时间筛选、日期运算、格式化,新手极易写错。
在企业实际工作中,日报、周报、月报、留存分析、订单时间统计,全都依赖 SQL 日期函数。 本篇把职场最常用的日期函数一次性讲透,搭配可直接运行 SQL 案例,零基础看完就能直接写时间类报表。
知识点
一、MySQL 常用时间类型
- DATE :只存日期
yyyy-MM-dd - TIME :只存时间
HH:mm:ss - DATETIME :日期 + 时间
yyyy-MM-dd HH:mm:ss - TIMESTAMP:时间戳,自动更新,用法和 DATETIME 类似
二、职场必掌握核心日期函数
表格
| 函数 | 作用 |
|---|---|
| NOW() | 获取当前系统日期 + 时间 |
| CURDATE() | 获取当前日期,不含时间 |
| CURTIME() | 获取当前时间,不含日期 |
| DATE_FORMAT() | 日期格式化,自定义展示格式 |
| YEAR()/MONTH()/DAY() | 提取年、月、日 |
| DATE_ADD() | 日期向后加时间(加天、月、年) |
| DATE_SUB() | 日期向前减时间 |
| DATEDIFF() | 计算两个日期's 相差天数 |
三、常用格式化匹配符
%Y:4 位年份%m:月份 (01-12)%d:日期 (01-31)%H:24 小时制%i:分钟%s:秒
通俗类比 + 实例表格
通俗类比
日期函数就像日历 + 计算器:
- NOW () 就是看现在几点几号;
- DATE_FORMAT 就是把时间换成我们习惯的年月日格式;
- DATE_ADD/DATE_SUB 就是往前翻日历、往后翻日历;
- YEAR/MONTH/DAY 就是单独挑出年份、月份、日子。
演示数据表:order_info 订单表
表格
| id | order_name | create_time |
|---|---|---|
| 1 | 手机订单 | 2026-05-20 08:30:25 |
| 2 | 电脑订单 | 2026-05-21 10:20:15 |
| 3 | 耳机订单 | 2026-05-22 15:45:30 |
SQL 代码演示
1. 获取当前时间、当前日期
sql
-- 当前日期+时间
SELECT NOW();
-- 只获取当前日期
SELECT CURDATE();
-- 只获取当前时分秒
SELECT CURTIME();
2. 日期格式化 DATE_FORMAT
sql
-- 把完整时间格式化为 年-月-日
SELECT
create_time,
DATE_FORMAT(create_time,'%Y-%m-%d') AS 订单日期
FROM order_info;
-- 格式化为 年-月-日 时分
SELECT
DATE_FORMAT(create_time,'%Y-%m-%d %H:%i') AS 订单简写时间
FROM order_info;
3. 提取年、月、日
sql
SELECT
create_time,
YEAR(create_time) AS 年份,
MONTH(create_time) AS 月份,
DAY(create_time) AS 日期
FROM order_info;
4. 日期加减 DATE_ADD / DATE_SUB
sql
-- 当前日期加7天(近7天统计常用)
SELECT DATE_ADD(CURDATE(),INTERVAL 7 DAY);
-- 当前日期减30天(近30天统计)
SELECT DATE_SUB(CURDATE(),INTERVAL 30 DAY);
-- 时间加1个月、加1年
SELECT
DATE_ADD(CURDATE(),INTERVAL 1 MONTH),
DATE_ADD(CURDATE(),INTERVAL 1 YEAR);
5. 计算日期间隔 DATEDIFF
sql
-- 计算两个日期相差天数,前面日期减后面日期
SELECT DATEDIFF('2026-05-22','2026-05-20') AS 相差天数;
6. 实战:查询近 7 天下单订单
sql
SELECT *
FROM order_info
WHERE create_time >= DATE_SUB(NOW(),INTERVAL 7 DAY);
易错 / 避坑点
-
❌ 格式化符号写错,% Y、% m、% d 大小写混淆 ✅ 记住:% Y4 位年、% m 月份、% d 日期,固定写法不能乱改。
-
❌ 直接用字符串时间比较,格式不统一查不出数据 ✅ 统一用 DATE_FORMAT 格式化后再筛选、分组。
-
❌ 日期加减搞反 DATE_ADD 和 DATE_SUB ✅ ADD 往后加(未来),SUB 往前减(过去)。
-
❌ DATEDIFF 时分秒不参与计算,只比年月日 ✅ DATEDIFF 只按日期算差,忽略时分秒。
-
❌ 分组统计不格式化时间,导致按秒分组数据散掉 ✅ 做日报按
%Y-%m-%d格式化,月报按%Y-%m格式化再分组。
小结
- NOW()/CURDATE()/CURTIME() 快速获取当前时间、日期;
- DATE_FORMAT 是报表神器,自定义时间展示格式;
- YEAR/MONTH/DAY 单独提取年月日,用于分组统计;
- DATE_ADD/DATE_SUB 实现日期加减,近 7 天、近 30 天统计必备;
- DATEDIFF 计算两个日期相差天数;
- 所有日报、周报、月报、时间范围筛选,都靠这套日期函数组合实现。
思考题
思考题 1
把 2026-05-20 08:30:25 格式化为 2026-05-20,写出 SQL 函数。
答案:
sql
SELECT DATE_FORMAT('2026-05-20 08:30:25','%Y-%m-%d');
思考题 2
写出查询近 30 天订单的 WHERE 条件。
答案:
sql
WHERE create_time >= DATE_SUB(NOW(),INTERVAL 30 DAY)
思考题 3
如何从时间字段中只提取月份?
答案 : 使用 MONTH() 函数:
sql
SELECT MONTH(create_time) FROM order_info;