MySQL中的DAYOFYEAR函数用于返回指定日期在当年对应的天数,返回值范围是1到366,其中闰年的最后一天会返回366,平年则返回365。这个函数在需要按年内的天数做统计、筛选或者排序的场景中非常实用。

DAYOFYEAR函数基本语法
DAYOFYEAR函数的基本语法格式非常简单,只需要传入一个合法的日期或者日期时间类型的参数即可,语法如下:
DAYOFYEAR(date)
其中date参数可以是DATE类型的字段、DATE类型的字面量,也可以是DATETIME、TIMESTAMP类型的字段或值,函数会自动提取其中的日期部分进行计算。如果传入的参数不是合法的日期格式,函数会返回NULL。
基础使用示例
下面通过几个简单的示例来展示DAYOFYEAR函数的基础用法,首先是对固定的日期字面量进行计算:
-- 查询2024年3月1日是当年的第几天,2024是闰年
SELECT DAYOFYEAR('2024-03-01') AS day_num;
-- 返回结果:61
-- 查询2023年12月31日是当年的第几天,2023是平年
SELECT DAYOFYEAR('2023-12-31') AS day_num;
-- 返回结果:365
-- 传入DATETIME类型的值,自动提取日期部分
SELECT DAYOFYEAR('2024-06-15 14:30:00') AS day_num;
-- 返回结果:167
实际业务场景应用
1. 按年内天数筛选数据
假设有一张订单表order_info,其中create_time是订单创建时间,类型为DATETIME,现在需要查询当年第100天到第200天之间创建的所有订单:
SELECT order_id, create_time FROM order_info WHERE DAYOFYEAR(create_time) >= 100 AND DAYOFYEAR(create_time) <= 200;
2. 按年内天数分组统计
如果需要统计每年内每一天的订单总数量,就可以结合DAYOFYEAR函数和GROUP BY子句实现:
SELECT
YEAR(create_time) AS order_year,
DAYOFYEAR(create_time) AS day_of_year,
COUNT(order_id) AS order_count
FROM order_info
GROUP BY YEAR(create_time), DAYOFYEAR(create_time)
ORDER BY order_year, day_of_year;
3. 结合其他日期函数使用
DAYOFYEAR函数可以和YEAR、MONTH等其他日期函数结合使用,比如查询所有创建时间在当年第200天之后的订单,同时展示订单的年份和月份:
SELECT
order_id,
YEAR(create_time) AS order_year,
MONTH(create_time) AS order_month,
DAYOFYEAR(create_time) AS day_of_year
FROM order_info
WHERE DAYOFYEAR(create_time) > 200;
使用注意事项
- 如果传入的参数是NULL,DAYOFYEAR函数会直接返回NULL,不会报错,编写查询时需要注意处理NULL值的情况。
- 函数的返回值仅和日期部分有关,和传入的时间部分无关,比如'2024-05-01 00:00:00'和'2024-05-01 23:59:59'的返回结果都是122。
- 当传入的日期字符串格式不合法时,比如'2024-13-01'这种不存在的月份,函数会返回NULL,建议提前校验日期的合法性。
- 如果是对大表使用DAYOFYEAR函数做条件筛选,可能会导致索引失效,因为函数作用在字段上会让数据库无法直接使用字段上的索引,这种情况下可以考虑提前计算好年内天数存到冗余字段中,提升查询效率。
常见问题解答
问:DAYOFYEAR函数和DAYOFMONTH函数有什么区别?
答:DAYOFMONTH函数返回的是日期在当月的天数,范围是1到31,而DAYOFYEAR返回的是日期在当年的天数,范围是1到366,两者的计算维度不同。
问:为什么我传入'2024-02-30'返回的是NULL?
答:因为2024年2月只有29天,不存在2月30日这个日期,属于不合法的日期格式,所以函数返回NULL。
MySQLDAYOFYEAR函数日期函数SQL查询修改时间:2026-07-15 08:51:28