sql查询一段时期里每一天所有员工的打卡记录
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql查询一段时期里每一天所有员工的打卡记录相关的知识,希望对你有一定的参考价值。
先有一个表格,内容非常多,如图所示,但是只需查询所有员工的早晚打卡记录.
本人已实现所有员工在指定某一天的最早和最晚的打卡记录.
现在需要实现的日期增加了.
现在要查询的是所有员工从某一指定日期段里的每一天的早晚打卡记录.
(比如, 从2013-07-15到系统时间, 又或者2013-05-06之前的所有记录)
大家一定会觉得看起来时间很多天,如果这样做即使写出来信息也会非常多.
在这里,我先解释一下,这真的就是我被要求要做的...不用管出来多少信息.
现在要的就是如下>>
1: 某一位员工在指定时间段里每一天的最早和最迟打卡记录
2: 某一位员工在指定时间段里每一天的工作时间(通过第一项来解决)
3: 所有员工在指定时间段里每一天的最早和最迟打卡记录
4: 所有员工在指定时间段里每一天的工作时间(通过第三项来解决)
以上四点其实到最后就是拿来算薪水或者做考勤统计的.
还望大侠们多多帮忙,小妹对SQL Server还不是太熟,还望大侠解释得详细点.
这里有个重点就是因为如图所示,数据库里表格众多,表里数据也非常多,所以希望写出来的脚本是能运行的比较快的,做好了有追加.
希望出来的格式是(比如)>>
card_no fname start_time end_time strat_time end_time ... ...
1 xxxxx xxxxx 2013-xx-xx xx:xx:xx 2013-xx-xx xx:xx:xx
2 xxxxx xxxxx 2013-xx-xx xx:xx:xx 2013-xx-xx xx:xx:xx
3 xxxxx xxxxx 2013-xx-xx xx:xx:xx 2013-xx-xx xx:xx:xx
4 xxxxx xxxxx 2013-xx-xx xx:xx:xx 2013-xx-xx xx:xx:xx
... ... ... ... ...
1、某一位员工在指定时间段里每一天的最早和最迟打卡记录
select min(card_no) card_no,min(fname) fname,min(rec_dat) start_time,max(rec_dat) end_timefrom EV_LOG
where card_no='员工卡号' and evnt_descrp='Access granted'
and convert(varchar(10),rec_dat,120) between '2013-07-01' and '2013-07-16'
group by convert(varchar(10),rec_dat,120)
3、 所有员工在指定时间段里每一天的最早和最迟打卡记录
select card_no,min(fname) fname,min(rec_dat) start_time,max(rec_dat) end_timefrom EV_LOG
where evnt_descrp='Access granted'and
convert(varchar(10),rec_dat,120) between '2013-07-01' and '2013-07-16'
group by card_no,convert(varchar(10),rec_dat,120)
2和4就不写了,用datediff(hh,start_time,end_time)就可以了
追问还有就是想问下,如果我想像我题目写的那样横向显示名字然后每一天的早晚时间该怎么写?
因为你给我的答案显示出来是纵向排列的.
不管怎样,太感谢了,能给个q号么?有问题的话想请教你.
select card_no, fname,min(开始时间) as 开始时间,max(结束时间)as结束时间,datediff(hh,开始时间,结束时间)
from 表
where 时间 between '开始' and '结束'
不是特明白LZ的意思。感觉是俩个表一个个人的一个所有人的。 参考技术B 用between and 就很好解决。 参考技术C 嘿嘿,考虑考虑追问
... 会就帮下啦...考虑什么类
蓝桥杯 考勤打卡
问题描述
小蓝负责一个公司的考勤系统, 他每天都需要根据员工刷卡的情况来确定 每个员工是否到岗。
当员工刷卡时, 会在后台留下一条记录, 包括刷卡的时间和员工编号, 只 要在一天中员工刷过一次卡, 就认为他到岗了。
现在小蓝导出了一天中所有员工的刷卡记录, 请将所有到岗员工的员工编号列出。
输入格式
输入的第一行包含一个正整数 nn, 表示一天中所有员工的刷卡记录的条数。 接下来 nn 行, 每行包含一条刷卡记录, 每条刷卡记录的格式为:
HH:MM:SS ID
其中 HH:MM: SS 表示刷卡时间, HH 为一个 0 到 23 之间的两位十进制整数 (可能含前导 0 ) 表示时, MM 为一个 0 到 59 之间的两位十进制整数 (可能含前 导 0) 表示分, SS 为一个 0 到 59 之间的两位十进制整数 (可能含前导 0 ) 表 示秒, ID 为一个不含前导 0 的整数表示员工的编号。
所有记录按照刷卡时间升序排列, 可能同一时刻有多人刷卡。
输出格式
输出若干行, 每行包含一个整数, 按照从小到大的顺序输出, 表示到岗员 工的编号。
样例输入
4
13:05:42 103
14:07:12 4567
15:03:00 103
17:00:21 1
样例输出
1
103
4567
评测用例规模与约定
对于 50% 的评测用例,1 ≤ n ≤ 1001≤n≤100。
对于所有评测用例,1 ≤ n ≤ 100001≤n≤10000,员工编号为不超过 10^9109 的正整数
运行限制
- 最大运行时间:1s
- 最大运行内存: 256M
解题思路
题目只用将员工编号排序,用变量接受空格号后的字符串即可。
员工可能会重复打卡,所以编号可能重复,我们只需要使用set()函数即可(消除重复多余的元素)
答案
import os
import sys
n = int(input())
ls_num = []
for i in range(n):
a, b = input().split(" ")
ls_num.append(int(b))
ls_num.sort()
ls = []
ls = list(set(ls_num))
ls.sort()
for i in range(len(ls)):
print(ls[i], end="\\n")
以上是关于sql查询一段时期里每一天所有员工的打卡记录的主要内容,如果未能解决你的问题,请参考以下文章