在MySQL里处理日期数据,经常会遇到只想知道“某条记录是几号”的需求,比如按每月的某几天做活跃用户分析,或者找出每个月最后三天产生的交易。DAYOFMONTH函数就是专门解决这个问题的内置函数,它从给定的日期或时间值中提取出当天是本月第几天,返回一个1到31之间的整数。

一、DAYOFMONTH函数基本语法
DAYOFMONTH函数的调用形式非常简单,它只接受一个参数,参数类型可以是DATE、DATETIME、TIMESTAMP,也可以是符合日期格式的字符串。函数会忽略时间部分,只看日期落在哪一天。如果传入的是NULL,函数也返回NULL;如果日期非法,比如2023-02-30,MySQL在严格模式下会报错,在非严格模式通常返回NULL。
下面是最基础的使用示例,直接给函数传一个日期字面量:
SELECT DAYOFMONTH('2023-08-15') AS day_num;
-- 返回结果:15
从示例可以看到,不管原值是哪年哪月,只要日子是15号,结果就是15。这种特性让它在做按日聚合时非常方便,因为你不需要关心月份长度差异。
二、结合表字段进行查询
实际开发中,我们更多是把DAYOFMONTH用在真实表字段上。假设有一张订单表orders,里面有个字段create_time记录了下单时间。现在想统计每个月10号产生的订单数量,可以这样写:
SELECT DATE_FORMAT(create_time, '%Y-%m') AS month, COUNT(*) AS order_count FROM orders WHERE DAYOFMONTH(create_time) = 10 GROUP BY DATE_FORMAT(create_time, '%Y-%m');
这段代码先通过DAYOFMONTH把每天的下单时间转成“几号”,再用WHERE筛出10号的数据,最后按月汇总。比起自己用字符串截取,函数写法可读性更高,而且能利用MySQL内部的日期解析逻辑,不容易因为格式问题出错。
需要注意的是,在WHERE里对字段套函数会让该列上的普通索引失效,如果数据量很大,可以考虑改用范围查询或者生成列加索引来优化。但对于中小规模表,DAYOFMONTH的写法足够直观且好维护。
三、与相似函数的区别
MySQL里还有DAY和DAYOFYEAR,新手容易搞混。DAY其实是DAYOFMONTH的同义词,两者完全等价;而DAYOFYEAR返回的是这一天是全年第几天,范围是1到366。下面的对比能看清差异:
| 函数 | 输入 | 返回含义 | 示例结果 |
|---|---|---|---|
| DAYOFMONTH | '2023-03-05' | 本月第几天 | 5 |
| DAY | '2023-03-05' | 同DAYOFMONTH | 5 |
| DAYOFYEAR | '2023-03-05' | 本年第几天 | 64 |
从表里能看出,如果只是做月内天数的判断,用DAYOFMONTH或DAY都行,但DAYOFYEAR完全是不同的维度。在写存储过程或视图时,明确用DAYOFMONTH能让后来的人一眼看懂业务意图,避免误以为是按年统计。
四、处理边界与空值情况
使用DAYOFMONTH时,边界情况主要集中在空值和非法日期。如果字段允许为NULL,那么函数结果也是NULL,在聚合时NULL不会被计入COUNT,但如果你用SUM之类就可能漏算,最好提前用COALESCE处理。示例如下:
SELECT DAYOFMONTH(COALESCE(create_time, '2000-01-01')) AS safe_day FROM orders;
另外,有些老系统会把日期存成'0000-00-00'这种零值,DAYOFMONTH遇到它会返回0而不是NULL,这在做条件判断时要特别小心,不能简单用大于0来过滤。建议在建表时开启严格模式,从源头杜绝零日期写入。
还有一个常见坑是时区,如果字段是TIMESTAMP且会话时区变了,DAYOFMONTH取出的“几号”可能跟着变。所以在跨时区服务里,最好先把时间转成统一时区再取天数,保证全球统计数据一致。
五、实用场景示例
除了简单查询,DAYOFMONTH还能用在生成月度账单周期上。比如找出每月25号到月底的所有流水,用于结算:
SELECT * FROM bills WHERE DAYOFMONTH(bill_date) >= 25;
这个写法比手写“下个月1号减五天”的日期运算更直白。配合CASE语句,还能给不同日期段打标签,比如把1到10号标为“上旬”,11到20标为“中旬”,方便后续分组分析。
总体来看,DAYOFMONTH是MySQL日期函数里轻量又实用的一个,掌握它的参数要求、索引影响和边界表现,就能在日报、月报、定时任务等场景里少走弯路,写出更稳的SQL。
MySQLDAYOFMONTH日期函数修改时间:2026-08-03 07:39:25