myaql中data找到各月最后一天
时间: 2025-06-29 13:11:16 AIGC 浏览: 23
### MySQL查询每个月最后一天
为了在MySQL中查找每个月的最后一天,可以利用`LAST_DAY()`函数来实现这一需求。此方法能够有效地返回给定日期所在月份的最后一日。
对于特定年份中的每个月最后一日的数据检索,可以通过构建动态SQL语句并结合循环结构完成多个月份数据的一次性提取;然而,在单条查询语句内解决这个问题更为简洁高效。下面提供了一种基于生成一系列代表各月第一天的虚拟记录的方法,并应用`LAST_DAY()`转换这些天成为对应月份的实际最晚日期[^3]:
```sql
SELECT DISTINCT LAST_DAY(DATE_ADD('2023-01-01', INTERVAL month_diff MONTH)) AS last_day_of_month
FROM (
SELECT t.i + 11 - MONTH('2023-01-01') AS month_diff
FROM (SELECT 0 i UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3
UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6
UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9
UNION ALL SELECT 10 UNION ALL SELECT 11) t
WHERE t.i <= TIMESTAMPDIFF(MONTH, '2023-01-01', CURDATE())
) months;
```
上述代码片段展示了如何创建一个临时表`t`用于生成连续整数序列作为偏移量,进而计算自定义起始时间点(此处设为'2023-01-01')以来经历过的每一个完整自然月的第一天,并最终调用`LAST_DAY()`获得相应的月末日期。
当目标是从某个具体表格如`employees`中选取每月最后一个工作日的相关记录时,则需进一步关联实际业务逻辑字段进行过滤操作。例如,假设存在名为`created_at`的时间戳列指示每笔交易的发生时刻,那么可采用如下方式定位到指定范围内各个会计周期结束之际的状态快照[^2]:
```sql
WITH RECURSIVE cte AS(
SELECT MIN(created_at) as dt,
MAX(LAST_DAY(created_at)) over () end_date
FROM employees
GROUP BY YEAR(created_at), MONTH(created_at)
),
cte2 AS(
SELECT e.*
FROM employees e JOIN cte ON DATE(e.created_at)=cte.dt OR (e.created_at<=cte.end_date AND NOT EXISTS(SELECT 1 FROM employees ee WHERE ee.created_at>e.created_at AND ee.created_at<=cte.end_date))
)
SELECT *
FROM cte2;
```
这段复杂度较高的CTE表达式首先通过分组聚合得到每年每月最早的`created_at`值以及整个区间内的最大月末日期;接着借助子查询排除掉同属一月中较早发生的事件实例只保留最后一次更新前后的状态变化情况。
阅读全文
相关推荐




















