Loading...
墨滴

加油董董同学

2021/11/20  阅读:22  主题:默认主题

mysql的日期函数的处理

mysql 有 5 种表示时间值的日期和时间类型

mysql 有 5 种表示时间值的日期和时间类型,分别为、DATE,TIME,YEAR,DATETIME,TIMESTAMP

MySQL 数据类型               含义

 date                     只存储年月日,'2018-07-12'

time                     只存储时分秒,'09:51:02'

datetime 存储年月日 时分秒,'2018-07-12 09:51:02'

timestamp            存储年月日 时分秒,'2018-07-12 09:51:02'   注:这个类型的字段时间会随着其他字段值的修改,自动刷新

year                     只存储年,'2018'

主要的还是对mysql的日期函数的使用 先说mysql获取当前时间的几种方法

  SELECT CURDATE() //获取是年月日
 SELECT NOW()//获取是年月日  时分秒
 SELECT CURRENT_DATE() //获取是年月日
 SELECT SYSDATE()//获取是年月日  时分秒

在真实的使用的情况是 业务获取今天所有的订单

SELECT * FROM kq_clock  WHERE  create_time=CURDATE()
SELECT * FROM kq_clock WHERE   attendance_date=NOW()
SELECT * FROM kq_clock WHERE   attendance_date=SYSDATE()

日期的中年月日时分秒星期月份等获取方法

select TIMESTAMP('2010-03-03 16:41:16'); //2010-03-03 16:41:16

select DATE('2010-03-03 16:41:16'); //2010-03-03

select YEAR('2010-03-03 16:41:16'); //2021

select MONTH('2010-03-03 16:41:16'); //3

select DAY('2010-03-03 16:41:16'); //3

select TIME('2010-03-03 16:41:16'); //16:41:16
SELECT WEEK(NOW())//47  获取本年第几周
SELECT MONTHNAME(NOW())//获取日期月份的英文
SELECT DAYNAME(NOW())//返回是英文名称

思考一个问题,假设一个表中有一个字段以;进行分割周的,现在我要获取这个周的跟这个进行比较,但是这个表跟那个表有关系

SELECT * FROM clock_log log INNER JOIN clock_time  time on  log.rules_id=time.rule_id
WHERE  DAYNAME(NOW()) in ( SELECT DISTINCT SUBSTRING_INDEX(SUBSTRING_INDEX(weekdays,',',b.help_topic_id + 1),',',-1) as  g
FROM  clock_time  INNER JOIN mysql.help_topic b ON b.help_topic_id < (LENGTH(clock_time.weekdays) - LENGTH(REPLACE(clock_time.weekdays, ',''')) + 1)  WHERE  clock_time.rule_id=time.rule_id)

这个语句的中weekdays字段保存数据是MONDAY;TUESDAY;WEDNESDAY;THURSDAY;FRIDAY周的所有的英文但是是大写的,我想的是截取今天周作为条件查询这个2表的关系进行查询,这里写的非常好

日期的算术运算

SELECT DATE_ADD('1999-01-01', INTERVAL 1 DAY)  //加一天
SELECT DATE_ADD(NOW(), INTERVAL 1 HOUR);//加一个小时
SELECT DATE_ADD(NOW(), INTERVAL 1 MONTH);//加一个月

列子 查询订单表中大于2021-11-02 10:00:00 的订单

SELECT * FROM order  WHERE create_time>date_add(
                        '2021-11-02 ',INTERVAL SUBSTRING_INDEX("09:00:00"':', 1) HOUR)

SUBSTRING_INDEX截取字符串以:这个考研用于time时分秒的字段 加一个小时

小时相减

SELECT DATE_SUB('1999-01-01', INTERVAL 1 DAY)  //减一天
SELECT DATE_SUB(NOW(), INTERVAL 1 HOUR);//减一个小时
SELECT DATE_SUB(NOW(), INTERVAL 1 MONTH);//减一个月

查询订单表中大于2021-11-02 8:00:00 的订单

SELECT * FROM order  WHERE create_time>date_sub(
                        '2021-11-02 ',INTERVAL SUBSTRING_INDEX("09:00:00"':', 1) HOUR)

厉害的人可以看看下面的sql查询是什么时候的订单,可以告诉我一下

SELECT * FROM order  WHERE create_time>date_sub(date_add(
                        '2021-11-02',INTERVAL SUBSTRING_INDEX("09:00:00"':', 1) HOUR)
                        ,INTERVAL SUBSTRING_INDEX("09:00:00"':', 1) HOUR)

格式化时间

date_format()函数

//需求1 查询这个月 8:00到 9:00的订单的数据呢

格式化 '%Y-%m-%d %H:%i:%S'

SELECT * FROM  `order` WHERE  date_format(create_time,'%H:%i')>='09:00'  and  date_format(create_time,'%H:%i')<='19:00' and date_format(create_time,'%Y-%m-%d')=DATE_FORMAT(NOW(),'%Y-%m-%d')  GROUP BY log.employee_id

现在要查询一个人规定上班时间和下班时间内的最早的一个数据看是不是迟到 怎么解决 我想的是

SELECT log.employee_id FROM kq_clock_log log INNER JOIN kq_clock_time  time on  log.rules_id=time.rule_id
WHERE   DATE_FORMAT(MIN(log.create_time),'%H:%i:%S')<=time.leave_time  
and   DATE_FORMAT(min(log.create_time),'%H:%i:%S')>=time.work_time
and   DATE_FORMAT((log.create_time),'%H:%i:%S')= DATE_FORMAT(NOW(),'%Y-%m-%d')  GROUP BY  log.employee_id

time.leave_time 规定的上班时间 time格式

work_time 规定的下班时间 time格式 但是 我要判断这个人最早的数据是不是在这个时间端中 上面的sql不能使用

 DATE_FORMAT(MIN(log.create_time),'%H:%i:%S')<=time.leave_time  
and   DATE_FORMAT(min(log.create_time),'%H:%i:%S')>=time.work_time

这个在where使用不了,但是having min(id)<10不能用这个 我就想一个简单 的方法

SELECT log.employee_id FROM clock_log log INNER JOIN clock_time  time on  log.rules_id=time.rule_idWHERE   DATE_FORMAT((log.create_time),'%H:%i:%S')<=time.leave_time  and  log.employee_id not  in ( SELECT log.employee_id FROM clock_log log INNER JOIN clock_time  time on  log.rules_id=time.rule_id where  DATE_FORMAT((log.create_time),'%H:%i:%S')<=time.work_time and  DATE_FORMAT((log.create_time),'%H:%i:%S')= DATE_FORMAT(NOW(),'%Y-%m-%d')  GROUP BY log.employee_id)and   DATE_FORMAT((log.create_time),'%H:%i:%S')>=time.work_time and   DATE_FORMAT((log.create_time),'%H:%i:%S')= DATE_FORMAT(NOW(),'%Y-%m-%d')  GROUP BY  log.employee_id

根据人员分组,进行not in 将这个规定时间前签到进行去调,再进行判断,大家对于这个

 DATE_FORMAT(MIN(log.create_time),'%H:%i:%S')<=time.leave_time  
and   DATE_FORMAT(min(log.create_time),'%H:%i:%S')>=time.work_time

有什么方法可以教教我,感谢,给大家带来mysql所有的日期的处理,希望大家在工作上使用到,例子非常好,写的都是真实项目中的例子

女孩子的教导

我是非常 喜欢技术的,大家有什么技术上的问题都可以加我微信进行问我,感谢大家的支持

加油董董同学

2021/11/20  阅读:22  主题:默认主题

作者介绍

加油董董同学