SQL 日期函数全套精讲!时间格式化、日期加减、年月日提取,做日报周报直接套用

前言

学会字符串函数后,做业务报表、数据统计又卡在日期时间处理

  • 数据库存的datetime 格式看不懂 ,想转成 yyyy-MM-dd 不会格式化;
  • 需要统计近 7 天、近 30 天数据,不会做日期加减
  • 单独提取年份、月份、日期、小时,不知道用什么函数;
  • 时间字段没法按日、按月、按季度分组统计,日报周报写不出来;
  • 面试常考:时间筛选、日期运算、格式化,新手极易写错。

在企业实际工作中,日报、周报、月报、留存分析、订单时间统计,全都依赖 SQL 日期函数。 本篇把职场最常用的日期函数一次性讲透,搭配可直接运行 SQL 案例,零基础看完就能直接写时间类报表。

知识点

一、MySQL 常用时间类型

  1. DATE :只存日期 yyyy-MM-dd
  2. TIME :只存时间 HH:mm:ss
  3. DATETIME :日期 + 时间 yyyy-MM-dd HH:mm:ss
  4. 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);

易错 / 避坑点

  1. ❌ 格式化符号写错,% Y、% m、% d 大小写混淆 ✅ 记住:% Y4 位年、% m 月份、% d 日期,固定写法不能乱改。

  2. ❌ 直接用字符串时间比较,格式不统一查不出数据 ✅ 统一用 DATE_FORMAT 格式化后再筛选、分组。

  3. ❌ 日期加减搞反 DATE_ADD 和 DATE_SUB ✅ ADD 往后加(未来),SUB 往前减(过去)。

  4. ❌ DATEDIFF 时分秒不参与计算,只比年月日 ✅ DATEDIFF 只按日期算差,忽略时分秒。

  5. ❌ 分组统计不格式化时间,导致按秒分组数据散掉 ✅ 做日报按 %Y-%m-%d 格式化,月报按 %Y-%m 格式化再分组。

小结

  1. NOW()/CURDATE()/CURTIME() 快速获取当前时间、日期;
  2. DATE_FORMAT 是报表神器,自定义时间展示格式;
  3. YEAR/MONTH/DAY 单独提取年月日,用于分组统计;
  4. DATE_ADD/DATE_SUB 实现日期加减,近 7 天、近 30 天统计必备;
  5. DATEDIFF 计算两个日期相差天数;
  6. 所有日报、周报、月报、时间范围筛选,都靠这套日期函数组合实现。

思考题

思考题 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;
相关推荐
杨云龙UP9 小时前
Linux 根分区被日志吃满?一次 58G Broker 日志清理实战_2026-05-20
linux·运维·服务器·数据库·hdfs·apache
sdk大全9 小时前
Studio 3T for MongoDB 2025.13.0
数据库·mongodb
码农阿豪9 小时前
平替MongoDB:金仓多模数据库助力电子证照国产化实践
数据库·mongodb
罗超驿9 小时前
22.深入剖析JDBC架构:从原生API到企业级数据交互核心
java·数据库·mysql·面试
易辰君9 小时前
【数据库】MongoDB深度解析与Python操作指南:从安装到实战操作全覆盖
数据库·mongodb
一直有一个ac的梦想9 小时前
cmu15445 2025fall lec 18 transactions with two-phase lock
java·开发语言·数据库
身如柳絮随风扬10 小时前
Redis 集群脑裂深度剖析:成因、危害与防丢失策略
数据库
雨辰AI10 小时前
人大金仓 V9 生产级专用监控大盘(含 120 + 指标 + 告警规则 + 一键导入)
java·开发语言·数据库·mysql·政务
l1t11 小时前
Hy-MT2-1.8B总结的pgvector 0.8.2解决了并行HNSW索引构建漏洞
数据库·人工智能·postgresql