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所有的日期的处理,希望大家在工作上使用到,例子非常好,写的都是真实项目中的例子
女孩子的教导 ![在这里插入图片描述](https://img-blog.csdnimg.cn/265ffaa0ff474c2d9ad30095169b1047.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2,shadow_50,text_Q1NETiBA5LiK5rW3SmF2YeS7juatpOS4jeWBmuiIlOeLlw==,size_18,color_FFFFFF,t_70,g_se,x_16#pic_center)