mysql 考勤表异常 【待修改】
有考勤刷卡记录表,表名为attendance ,有如下字段:
姓名 卡号 刷卡时间 刷卡类型
name
id
time
type
张三 59775623 2010-04-01 07:23:37
null
张三 59775623 2010-04-01 07:50:21
null
张三 59775623 2010-04-01 18:20:22
null
张三 59775623 2010-04-01 18:50:53
null
李四 59775624 2010-04-01 07:00:06
null
李四 59775624 2010-04-01 18:00:12
null
李四 59775624 2010-04-02 08:20:32
null
李四 59775624 2010-04-02 17:00:22
null
李四 59775624 2010-04-01 18:00:08
null
.....................................................................................................
以下还有很多,每位员工每天都有,...............
现在需要更新刷卡的数据,需要对表attendance执行一个
update
动作,根据刷卡时间,需满足如下功能
1.如果刷卡时间是8:00以前,则type的值
update
之后就为“上班”;
2.如果刷卡时间是17:30以后,则type的值
update
之后就为“下班”;
3.如果刷卡时间为8:00~~12:00之间,则type的值
update
之后就为“迟到”;
4.如果刷卡时间为13:00~~17:30之间,则type的值
update
之后就为“早退”;
5.如果同一个人同一天在12:00以前有多次刷卡,则刷卡时间最早的那一笔记录其type值为“上班”,其余12:00以前的刷卡记录其type值
update
之后,变为“上班重复刷卡;
6. 如果同一个人同一天在13:00以后有多次刷卡,则刷卡时间最迟的那一笔记录其type值为“下班”,其余13:00以后的刷卡记录其type值
update
之后,变为“下班重复刷卡;
7.其余每天的任何时间段,
update
后,type值变为“乱刷卡”
小弟最头痛的是其中的5、6两种情况,可以使用
where
+
group
by
+ haviing
count
(*)>1将其查出来,
update
就不知道如何处理了,小弟思考了好几天,也只能做到这一步,实在做不下去了,跑来求助各位达人;
问题补充:
1.请各位达人务必注意那个时间的格式,SQL里面转换时间格式可以使用
convert
(
char
(10),
time
,120),输出为YYYYMMDD;
convert
(
char
(8),
time
,112),输出格式为YYYYMMDD;
convert
(
char
(10),
time
,108),输出为HH-MM-SS
use test
go
if object_id(
'test.dbo.attendance'
)
is
not
null
drop
table
attendance
-- 创建数据表
create
table
attendance
(
name
char
(5),
id
int
,
time
datetime,
type
char
(20)
)
go
--插入测试数据
insert
into
attendance
select
'张三'
,59775623,
'2010-04-01 07:23:37'
,
null
union
all
select
'张三'
,59775623,
'2010-04-01 07:50:21'
,
null
union
all
select
'张三'
,59775623,
'2010-04-01 18:20:22'
,
null
union
all
select
'张三'
,59775623,
'2010-04-01 18:50:53'
,
null
union
all
select
'李四'
,59775624,
'2010-04-01 07:00:06'
,
null
union
all
select
'李四'
,59775624,
'2010-04-01 18:00:12'
,
null
union
all
select
'李四'
,59775624,
'2010-04-02 08:20:32'
,
null
union
all
select
'李四'
,59775624,
'2010-04-02 17:00:22'
,
null
union
all
select
'李四'
,59775624,
'2010-04-02 18:18:08'
,
null
union
all
select
'王五'
,59775625,
'2010-04-01 08:02:06'
,
null
union
all
select
'王五'
,59775625,
'2010-04-01 18:00:12'
,
null
union
all
select
'王五'
,59775625,
'2010-04-02 07:20:32'
,
null
union
all
select
'王五'
,59775625,
'2010-04-02 12:35:22'
,
null
union
all
select
'王五'
,59775625,
'2010-04-02 18:18:08'
,
null
go
*/
-->更新数据
update
attendance
set
type=t2.type
from
attendance t1
inner
join
(
select
name
,id,
time
=_time,type=
case
when
time
<=
'08:00'
and
idd=1
then
'上班'
when
time
>
'08:00'
and
time
<=
'12:00'
and
idd=1
then
'迟到'
when
time
<
'12:00'
and
idd<>1
then
'上班重复刷卡'
when
time
>=
'13:00'
and
time
<=
'17:30'
and
idd=1
then
'早退'
when
time
>
'17:30'
and
idd=1
then
'下班'
when
time
>
'13:00'
and
idd<>1
then
'下班重复刷卡'
when
time
>=
'12:00'
and
time
<=
'13:00'
then
'乱刷卡'
end
from
(
select
name
,id,_time=
time
,
time
=
convert
(
varchar
(5),
time
,8),type,
idd=row_number()over(partition
by
convert
(
varchar
(10),
time
,120),
name
order
by
time
)
from
attendance
where
convert
(
varchar
(5),
time
,8)<=
'12:00'
union
all
select
name
,id,_time=
time
,
time
=
convert
(
varchar
(5),
time
,8),type,
idd=row_number()over(partition
by
convert
(
varchar
(10),
time
,120),
name
order
by
time
)
from
attendance
where
convert
(
varchar
(5),
time
,8)>=
'13:00'
union
all
select
name
,id,_time=
time
,
time
=
convert
(
varchar
(5),
time
,8),type,idd=0
from
attendance
where
convert
(
varchar
(5),
time
,8)>=
'12:00'
and
convert
(
varchar
(5),
time
,8)<=
'13:00'
)t
) t2
on
t1.id=t2.id
and
t1.
time
=t2.
time
-->显示更新后数据
select
*
from
attendance
/*测试结果
name
id
time
type
--------------------------------------------------------------
张三 59775623 2010-04-01 07:23:37.000 上班
张三 59775623 2010-04-01 07:50:21.000 上班重复刷卡
张三 59775623 2010-04-01 18:20:22.000 下班
张三 59775623 2010-04-01 18:50:53.000 下班重复刷卡
李四 59775624 2010-04-01 07:00:06.000 上班
李四 59775624 2010-04-01 18:00:12.000 下班
李四 59775624 2010-04-02 08:20:32.000 迟到
李四 59775624 2010-04-02 17:00:22.000 早退
李四 59775624 2010-04-02 18:18:08.000 下班重复刷卡
王五 59775625 2010-04-01 08:02:06.000 迟到
王五 59775625 2010-04-01 18:00:12.000 下班
王五 59775625 2010-04-02 07:20:32.000 上班
王五 59775625 2010-04-02 12:35:22.000 乱刷卡
王五 59775625 2010-04-02 18:18:08.000 下班
(14 行受影响)
*/
mysql 考勤表异常 【待修改】的更多相关文章
- 阿里云ECS(linux)磁盘满触发的mysql的表异常修复案例
阿里云ECS(linux)磁盘满触发的mysql的表异常修复案例 阿里云技术支持:完颜镇江 问题现象: 磁盘空间满了,第一想到的就是删除无用的服务日志或者升级数据盘. 通常是使用du –sh去分析目录 ...
- MySQL根据表前缀批量修改、删除表
注意:请先调试好,以及做好备份,再执行操作. 批量修改表 批量给前缀为 xushanxiang_content_ 的表增加一个 username 的字段: SELECT CONCAT('ALTER T ...
- (转)mysql数据库表名批量修改大小写
由于不用服务器对mysql的表名的大小写敏感要求不一致,经常在出现线上的数据库down到了本地不能运行的情况,贴出一段代码用来批量修改数据库表名大小写. DELIMITER // DROP PROCE ...
- mysql多表关联update修改操作
UPDATE province_yunnan_salary s1 JOIN province_guangdong_salary s2 ON s1.user_name= s2.user_name S ...
- mysql数据库表的基本操作sql语句总结
1,命令行登录命令 mysql -h localhost -u root -p C:\Users\lenovo>mysql -u root -p Enter password: ***** We ...
- 修改MYSQL数据库表的字符集
MySQL 乱码的根源是的 MySQL 字符集设置不当的问题,本文汇总了有关查看 MySQL 字符集的命令.包括查看 MySQL 数据库服务器字符集.查看 MySQL 数据库字符集,以及数据表和字段的 ...
- phpMyAdmin批量修改Mysql数据表前缀的方法
多个网站共用一个Mysql数据库时,为使数据库管理不混乱,一般采用不同的网站使用不同前缀名的方式进行区分.而如何批量修改已有数据库的前缀名 呢?全部导出修改后再导入?还是一个表一个表的修改?今天我要介 ...
- 查看mysql数据库表大小和最后修改时间
查看mysql数据库表相关信息如表大小.修改更新等信息,可以通过以下方式: 一 show table status like ’table_name‘ ; 二 在infortmation_sche ...
- MySQL使用pt-online-change-schema工具在线修改1.6亿级数据表结构
摘 要:本文阐述了MySQL DDL 的问题现状.pt-online-schema-change的工作原理,并实际利用pt-online-schema-change工具在线修改生产环境下1.6亿级数 ...
随机推荐
- 一次PHP面试经历
9月9号,去了一家朋友的公司参加面试,然后就被直接吊打了,问的许多问题居然是我压根没有关心过的,看起来只在高层搞框架不行啊,还是得自己造个轮子试试,下面回顾一下问到的问题和我自己找到的一些答案. fi ...
- 每天一个linux命令9之crontab 定时任务
crond 是linux用来定期执行程序的命令.当安装完成操作系统之后,默认便会启动此 任务调度命令.crond命令每分锺会定期检查是否有要执行的工作,如果有要执行的工作便会自动执行该工作. 1语法 ...
- WPF程序中的弱事件模式
在C#中,得益于强大的GC机制,使得我们开发程序变得非常简单,很多时候我们只需要管使用,而并不需要关心什么时候释放资源.但是,GC有的时并不是按照我们所期望的方式工作. 例如,我想实现一个在窗口的标题 ...
- linux命令详解:basename命令
转:http://www.cnblogs.com/lwgdream/archive/2013/11/05/3407768.html 前言 bashname命令用于获取路径中的文件名或路径名(获取的时候 ...
- WEB-INF有关的目录路径问题总结
1.资源文件只能放在WebContent下面,如 CSS,JS,image等.放在WEB-INF下引用不了. 2.页面放在WEB-INF目录下面,这样可以限制访问,提高安全性.如JSP,html 3. ...
- ES6里关于函数的拓展(一)
一.形参默认值 Javascript函数有一个特别的地方,无论在函数定义中声明了多少形参,都可以传入任意数量的参数,也可以在定义函数时添加针对参数数量的处理逻辑,当已定义的形参无对应的传入参数时为其指 ...
- 对tensorflow 中的attention encoder-decoder模型调试分析
#-*-coding:utf8-*- __author = "buyizhiyou" __date = "2017-11-21" import random, ...
- scrapy爬虫 函数间传值简易教程
2017-03-27 有的时候我们爬取数据的时候需要在多个页面之间跳转,爬取完所有页面的数据的时候才能把所有数据一起存到数据库,这个时候我们就需要把某个函数内爬取的数据传到下一个函数当中.有人可能会说 ...
- shell中set命令
set命令作用主要是显示系统中已经存在的shell变量,以及设置shell变量的新变量值.set命令不能够定义新的shell变量.如果要定义新的变量,可以使用declare命令以变量名=值的格式进行定 ...
- Word文档打不开怎么办
目前一些主流的办公软件给大家日常工作带来了很大便利,比如:Microsoft Office或金山WPS!我们在愉快地使用它们的同时,多少也遇到了一些让人尴尬或头疼的问题,比如:精心制作的文档,突然打不 ...