mysql面试题 练习题

题目:一、题目:写一个查询语句,输入参数:日期(date),输出表格如下:

在这里插入图片描述

题干:create table work_plan
(
worker_name varchar(10), --人员
start_date date, --派工起始日
end_date date, --派工截止日
sign_time varchar(10) --派工期间的需要打卡时间
)

insert into work_plan values
(‘张三’,‘2020-01-01’,null,‘06:30’),
(‘李四’,‘2020-02-01’,‘2020-02-15’,‘07:00’),
(‘王五’,‘2019-12-29’,‘2020-03-30’,‘06:00’),
(‘赵六’,‘2019-12-29’,‘2020-03-30’,‘06:00’)

create table sign_log
(
worker_name varchar(10),
sign_time datetime
)
insert into sign_log values
(‘张三’,‘2020-02-16 04:01’),
(‘张三’,‘2020-02-16 05:02’),
(‘张三’,‘2020-02-16 06:03’),
(‘王五’,‘2020-02-16 07:03’),
(‘王五’,‘2020-02-16 08:03’),
(‘王五’,‘2020-02-16 09:03’)

1、表示某人从某日开始到某日结束,按要求工作,派工期间每日打卡时间必须在“要求到岗时间”前(含要求时间,精确到分钟),否则迟到。
例如:
要求7:00,则6:59或者7:00:59 都不算迟到;7:01则视为迟到1分钟

2、行1中“派工结束日期”为null,表示此人的工作结束时间尚未确定,还在搬砖中;
行2中派工结束日期为2020-02-15,表示派工于02-15日结束。

3、假设员工名字不重复,每人只有一条派工信息
打卡记录表
在员工每次按指纹考勤时
都会生成一条记录
注:
1、2020-02-16李四派工期已结束,不在派工期间不需要计算考勤,故不用显示
2、赵六在当日没有打卡,按照迟到算,迟到时间1440分钟

答案:

#################答案##################
SELECT a.worker_name,a.sign_time,DATE(b.sign_time) sign_date,MIN(TIME(b.sign_time)) SIGNED,
CASE WHEN b.sign_time IS NULL OR CONCAT('2020-02-16',' ',a.sign_time)<MIN(b.sign_time) 
THEN '是' ELSE '否' END isLate,
CASE WHEN b.sign_time IS NULL THEN 1440
WHEN TIMESTAMPDIFF(MINUTE,CONCAT('2020-02-16',' ',a.sign_time),MIN(b.sign_time))<=0 THEN 0
ELSE TIMESTAMPDIFF(MINUTE,CONCAT('2020-02-16',' ',a.sign_time),MIN(b.sign_time)) END late_minute
FROM work_plan a LEFT JOIN sign_log b ON a.worker_name=b.worker_name
WHERE DATE(b.sign_time)='2020-02-16' 
AND end_date IS NULL OR '2020-02-16' BETWEEN start_date AND end_date 
GROUP BY a.worker_name;
#################答案##################

题目:二、另外请模拟以下场景,来写对应的sql语句:

1、某天打卡机异常,需要对公司所有员工当天的考勤统一处理为7:00(注:当天已经打卡的不用处理)
答案:

SELECT w.worker_name, 
CASE WHEN s.sign_time IS NULL THEN '7:00:00' 
	ELSE MIN(s.sign_time) END 打卡时间
FROM work_plan w
LEFT JOIN sign_log s ON w.`worker_name`=s.`worker_name`
GROUP BY w.worker_name

猜你喜欢

转载自blog.csdn.net/qq_42005540/article/details/114325274