查询每天最早的记录和最晚的记录

select price,time from(

select price,time,date from 
(
select price,time,date from on_jiaoyi_into where sid=3
order by date,time desc
) a

) b group by date

 

<think>好的,我现在需要解决用户的问题:在Excel中,有工号、日期多个打卡时间,要求用VBA计算每个人每天最早最晚打卡时间。让我仔细想想该怎么做。 首先,我得理解数据结构。用户的数据应该包含三列:工号、日期、打卡时间。每个员工每天可能有多次打卡记录。目标是对每个员工每天的打卡时间找出最早最晚时间。 接下来,我需要确定处理步骤。可能的步骤包括: 1. **数据排序**:按工号日期排序,这样同一员工同一天的数据会集中在一起,方便处理。 2. **遍历数据**:逐行检查,当工号或日期变化时,记录前一个员工日期的打卡时间。 3. **提取时间**:对于每个员工每天的打卡时间,比较并找到最早最晚时间。 4. **输出结果**:将结果写入新的工作表或指定位置。 然后,我需要考虑如何用VBA实现这些步骤。可能的VBA方法包括: - 使用字典(Dictionary)来存储每个员工日期对应的打卡时间集合。字典的键可以是工号日期的组合,值则是一个集合或数组,存储所有打卡时间。 - 循环遍历每一行数据,将时间添加到对应的字典条目中。 - 处理完所有数据后,遍历字典的每个键,计算最小最大时间,并输出结果。 需要注意的是,日期时间在Excel中的处理。确保打卡时间被正确识别为时间格式,否则比较可能会出错。此外,处理大量数据时,需要考虑性能问题,比如关闭屏幕更新自动计算。 可能遇到的挑战包括: - **数据格式不一致**:比如日期或时间存储为文本,需要转换为正确的格式。 - **跨天打卡**:如果打卡时间跨过午夜,可能需要特殊处理,但用户的问题中指定是“每天”,所以假设所有打卡时间都属于同一日期。 - **重复数据或空值**:需要处理可能的空单元格或无效数据,避免运行时错误。 代码结构的大致思路: 1. 声明变量,包括字典、工作表对象、循环变量等。 2. 初始化字典,可能需要引用Scripting.Runtime库。 3. 循环遍历数据行,将工号日期组合作为键,时间存入数组。 4. 对每个键的数组进行排序或查找最小最大值。 5. 将结果输出到指定位置,可能需要新建工作表或覆盖原有数据。 测试案例也很重要。例如,同一员工同一天有三个打卡时间:08:00, 12:30, 18:00,应得到最早08:00,最晚18:00。需要确保代码正确处理这种情况。 最后,代码可能需要优化,比如使用数组读取数据而不是逐行处理,以提高效率,尤其是在数据量大的情况下。</think>以下是使用VBA实现「按工号+日期统计最早/最晚打卡时间」的解决方案: ```vba Sub CalculatePunchTimes() Dim ws As Worksheet Dim dict As Object Dim lastRow As Long, i As Long Dim key As String Dim punchTime As Date Dim minTime As Date, maxTime As Date Dim outputRow As Long ' 设置数据源工作表(根据实际情况修改名称) Set ws = ThisWorkbook.Sheets("考勤记录") ' 创建字典存储数据 Set dict = CreateObject("Scripting.Dictionary") ' 获取最后一行数据 lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row ' 遍历数据行 For i = 2 To lastRow ' 假设第一行是标题 key = ws.Cells(i, 1).Value & "|" & Format(ws.Cells(i, 2).Value, "yyyymmdd") punchTime = TimeValue(ws.Cells(i, 3).Value) ' 如果键不存在则初始化数组 If Not dict.Exists(key) Then dict.Add key, Array(punchTime, punchTime) Else ' 更新最早最晚时间 minTime = Application.Min(dict(key)(0), punchTime) maxTime = Application.Max(dict(key)(1), punchTime) dict(key) = Array(minTime, maxTime) End If Next i ' 创建结果表 With ThisWorkbook.Sheets.Add(After:=ThisWorkbook.S
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值