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亿级数 ...
随机推荐
- 磁盘爆满导致MySQL无法启动:Disk is full writing './mysql-bin.~rec~' (Errcode: 28). Waiting for someone to free space...
今天收到监控邮件说博客访问失败.打开页面一看,硕大的502 Bad Gateway,ping了一下VPS发现是通的,SSH连接上去看了下Nginx日志发现没问题,重启lnmp的时候发现Mysql起不来 ...
- T-SQL语言基础(转载)
本文转自http://www.cnblogs.com/Jolinson/p/3552786.html 这里的摘抄来自<Microsoft SQL Server 2008技术内幕:T-SQL语言基 ...
- 【微信】微信小程序 微信开发工具 创建js文件报错 pages/module/module.js 出现脚本错误或者未正确调用 Page()
创建报错pages/module/module.js 出现脚本错误或者未正确调用 Page() 解决方法: 在js文件中添加 Page({ })
- 利用DFS求联通块个数
/*572 - Oil Deposits ---DFS求联通块个数:从每个@出发遍历它周围的@.每次访问一个格子就给它一个联通编号,在访问之前,先检查他是否 ---已有编号,从而避免了一个格子重复访问 ...
- Camera图像处理原理及实例分析
Camera图像处理原理及实例分析 作者:刘旭晖 colorant@163.com 转载请注明出处 BLOG:http://blog.csdn.net/colorant/ 主页:http://rg ...
- ES6中的迭代器(Iterator)和生成器(Generator)(二)
一.内建迭代器 迭代器是ES6的一个重要组成部分,在ES6中,已经默认为许多内建类型提供了内建迭代器,只有当这些内建迭代器无法实现目标时才需要自己创建.通常来说当定义自己的对象和类时才会遇到这种情况, ...
- 机器学习&深度学习资料(转载)
转自 飞鸟各投林 <Brief History of Machine Learning> 介绍:这是一篇介绍机器学习历史的文章,介绍很全面,从感知机.神经网络.决策树.SVM.Adaboo ...
- asp.net购物车,订单以及模拟支付宝支付(三)---提交订单
在设计完订单表之后,就要整理一下订单处理的流程了 首先,用户在购物车界面点击结算的时候,跳到一个结算确认页面(这时候只是确认,让用户填写收货地址等,没有真正的下订单),显示用户的地址等信息和要买的物品 ...
- 2017.5.24 在intelliJ IDEA 中生成war包
1.勾选Build on make file -> project structure -> Artifacts 2.compile module "***" 选择项目 ...
- Tomcat 高性能实现关键点
我在这里给大家讲解下Tomcat架构设计的几个关键要素,重点从性能及高可用等几个方面来讲解: 1.技术选型 (1) BIO方式适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限 ...