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_time
from 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_time

from 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号么?有问题的话想请教你.

参考技术A 是这个意思吗?

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查询一段时期里每一天所有员工的打卡记录的主要内容,如果未能解决你的问题,请参考以下文章

sql 查询一段时间内 每一天的统计数据

简单的sql分组统计

oracle 查询一段时间内每一天的统计数据sql怎么写

[SQL]查询某一个字段在某一段时期数据库中使用到的记录

蓝桥杯 考勤打卡

请用sql实现查询出每个员工2019年10月份上班打卡次数,并按打卡次数从大到小排序卡次数从大到小排序?