MySQL中DAYOFMONTH函数怎么用

来源:AI技术网作者:风铃头衔:草根站长
导读:本期聚焦于小伙伴创作的《MySQL中DAYOFMONTH函数怎么用》,敬请观看详情。做报表统计时经常要把订单按自然月拆开看,可日期字段里藏的是完整时间戳,直接拿来分组会乱套。DAYOFMONTH就是MySQL专门用来从日期里抠出“几号”的函数,它接收一个日期或 datetime 值,返回一号到三十一号之间的整数。和 DAY 或 DAYOFYEAR 不同,它只关心月内天数,不跨月也不算年积日。实际写查询时,既能直接喂日期字符串,也能传表里的字段,还能配合 WHERE 过滤月初月末数据。搞清楚它的空值处理和非法日期表现,才能避免统计结果悄悄偏掉。

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

MySQL中DAYOFMONTH函数怎么用

一、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'同DAYOFMONTH5
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

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。