DATE_ADD的一次使用经历

本文介绍了一个关于使用DATE_ADD函数的bug,当起止时间选择为同一天时无法查询到数据的问题。通过调整输入参数的数据格式从localdate改为string类型解决了这一问题。

最近项目上出了bug,起止时间都选择tong同一天的时候,查不到数据

查看sql中使用的是DATE_ADD函数,查询之后:

DATE_ADD(date,INTERVAL expr type)

 其中:date 参数是合法的日期表达式。expr 参数是您希望添加的时间间隔。type 参数可以是下列值:

Type 值
MICROSECOND
SECOND
MINUTE
HOUR
DAY
WEEK
MONTH
QUARTER
YEAR
SECOND_MICROSECOND
MINUTE_MICROSECOND
MINUTE_SECOND
HOUR_MICROSECOND
HOUR_SECOND
HOUR_MINUTE
DAY_MICROSECOND
DAY_SECOND
DAY_MINUTE
DAY_HOUR
YEAR_MONTH

但是,最开始date的入参数据格式是localdate,在接口查询中没有生效,后la来将数据格式改成string后,即可正常。

 

### 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`值以及整个区间内的最大月末日期;接着借助子查询排除掉同属一月中较早发生的事件实例只保留最后一次更新前后的状态变化情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值