一、背景
1、由于项目需要,测试项目的打卡签到;模拟连续签到数据,由于需要每次打完卡后,修改指定数据到前一天,
log表中记录到N条数据时,手动修改很是麻烦;
于是思考是否有相关sql函数可以处理,经搜索和实践,通过DATE_ADD(),DATE_SUB();函数可以实现
二、相关知识
MySQL 为日期增加一个时间间隔用date_add()函数
MySQL 为日期减去一个时间间隔用date_sub()函数
1:设置当前时间变量
SET @mytime=NOW();
SELECT @mytime;
2、增加一天
#加一天
SELECT DATE_ADD(@mytime, INTERVAL 1 DAY);
3、减少一天
#减一天
SELECT DATE_SUB(@mytime, INTERVAL 1 DAY);
4、其他时间段操作
#同理增加一小时,一分钟可以用:
SELECT DATE_ADD(@mytime, INTERVAL 1 HOUR); -- 增加一小时
SELECT DATE_ADD(@mytime, INTERVAL 1 MINUTE); -- 增加一分钟
SELECT DATE_ADD(@mytime, INTERVAL 1 SECOND); -- 增加一秒钟
SELECT DATE_ADD(@mytime, INTERVAL 1 MICROSECOND); -- 增加一微妙
SELECT DATE_ADD(@mytime, INTERVAL 1 WEEK); -- 增加一星期
SELECT DATE_ADD(@mytime, INTERVAL 1 MONTH); -- 增加一个月
SELECT DATE_ADD(@mytime, INTERVAL 1 QUARTER); -- 增加一季(三个月)
#减少一小时,一分钟可以用:
SELECT DATE_SUB(@mytime, INTERVAL 1 HOUR); -- 减少一小时
SELECT DATE_SUB(@mytime, INTERVAL 1 MINUTE); -- 减少一分钟
SELECT DATE_SUB(@mytime, INTERVAL 1 SECOND); -- 减少一秒钟
SELECT DATE_SUB(@mytime, INTERVAL 1 MICROSECOND); -- 减少一微妙
SELECT DATE_SUB(@mytime, INTERVAL 1 WEEK); -- 减少一星期
SELECT DATE_SUB(@mytime, INTERVAL 1 MONTH); -- 减少一个月
SELECT DATE_SUB(@mytime, INTERVAL 1 QUARTER); -- 减少一季(三个月)
三、具体业务解决
1、日志表中记录每一天的打卡记录和天数每次模拟前一天,需要手动修改,比较麻烦和费时;
修改前:
2、通过指定时间字段,再结合上面的时间函数,即可全局修改
UPDATE xxx_log.`consecutive_sign_log` SET sign_time = DATE_SUB(sign_time, INTERVAL 1 DAY) WHERE user_id = 'xxx29775';
修改后: