Sql server 获取最小输入时间和最大输出时间。Sql Server中的Fom考勤记录
我正在开发考勤系统,下面是我在sql server数据库中的数据Sql server 获取最小输入时间和最大输出时间。Sql Server中的Fom考勤记录,sql-server,sql-server-2008,sql-server-2005,sql-server-2012,sql-server-2008-r2,Sql Server,Sql Server 2008,Sql Server 2005,Sql Server 2012,Sql Server 2008 R2,我正在开发考勤系统,下面是我在sql server数据库中的数据 |EmpCode|Date |WorkDate |CheckIn |CheckOut |TotalTime |143 |2017-02-13 |2017-02-13 |20:09:02 |22:38:50 |2.496666000 |143 |2017-02-13 |2017-02-13 |22:59:19 |23:18:15 |0.315555000 |143 |201
|EmpCode|Date |WorkDate |CheckIn |CheckOut |TotalTime
|143 |2017-02-13 |2017-02-13 |20:09:02 |22:38:50 |2.496666000
|143 |2017-02-13 |2017-02-13 |22:59:19 |23:18:15 |0.315555000
|143 |2017-02-13 |2017-02-13 |23:33:47 |05:04:24 |5.510277000
|143 |2017-02-14 |2017-02-13 |02:52:38 |05:12:04 |2.323888000
|143 |2017-02-14 |2017-02-14 |20:09:26 |21:59:27 |1.833611000
|143 |2017-02-14 |2017-02-14 |22:30:10 |22:49:26 |0.321111000
|143 |2017-02-15 |2017-02-14 |05:05:05 |05:08:13 |0.052222000
--我想要像这样的输出
|EmpCode|wrk |InTime |OutTime |TotalTime
|143 |2017-02-13 |08:09:02 PM|05:12:04 AM|10:38:00
|143 |2017-02-14 |08:09:26 PM|05:08:13 AM|02:12:00
假设您需要这些特定的时间格式: 雷克斯测试仪: 查询:
select
EmpCode
, wrk = convert(varchar(10),WorkDate,120)
, InTime = format(cast(min(Date + CheckIn) as datetime), 'hh:mm:ss tt')
, OutTime = format(cast(max(Date + CheckOut) as datetime), 'hh:mm:ss tt')
, TotalTime = format(dateadd(minute,sum(TotalTime)*60,0), 'HH:mm:ss')
from t
group by
EmpCode
, WorkDate
结果:
+---------+------------+-------------+-------------+-----------+
| EmpCode | wrk | InTime | OutTime | TotalTime |
+---------+------------+-------------+-------------+-----------+
| 143 | 2017-02-13 | 08:09:02 PM | 05:12:04 AM | 10:38:00 |
| 143 | 2017-02-14 | 08:09:26 PM | 05:08:13 AM | 02:12:00 |
+---------+------------+-------------+-------------+-----------+
将为您的表中每个用户每天提供最小的
InTime
、最大的OutTime
和总的TotalTime
。SQLzim有一个很好的答案。他们只需要确定入住日期和退房时间。你是怎么得到这些总数的?您使用的是符号值吗?求和总时间。你得到10.646分左右。十小时就是十小时。以.646*60为例,你大概得到38。我以你使用哪个版本的总时间为参考。。。你标记了4。。。删除与您的版本不匹配的标记。在删除答案之前,您的路径肯定是正确的,更新看起来不错!谢谢当我注意到格式不是结果中指定的格式时,我退出了,并希望在恢复之前进行测试。@xQbert您的个人资料中的帖子链接已被删除:(哦,好吧。我会删除链接。谢谢。但我会保留交换的要点。我仍然觉得它很有趣。@xQbert我同意,希望我能在上下文中看到它。不要认为这可以正确处理第四行,因为“Min”签入将是02:52:38,并且总时间的格式不正确。
select *
, datediff(minute, first_in, last_out) as Totaltime
from (
select emp_reader_id
, min(case when Event_entry.event_entry_name = 'IN' then trnevents.DT end) as Intime
, max(case when Event_entry.event_entry_name = 'OUT' then trnevents.DT end) as Outtime
, cast(min(trnevents.DT) as date) as date
from trnevents inner join Event_entry on trnevents.EventCatId=Event_entry.EventCatId
group by
emp_reader_id
, cast(trnevents.DT as date)
) as SubQueriesMustBeNamed
select EmpCode, WorkDate as wrk, min(InTime) as InTime, max(OutTime) as OutTime, Sum(TotalTime) as TotalTime
from yourtable
group by EmpCode, WorkDate
select *
, datediff(minute, first_in, last_out) as Totaltime
from (
select emp_reader_id
, min(case when Event_entry.event_entry_name = 'IN' then trnevents.DT end) as Intime
, max(case when Event_entry.event_entry_name = 'OUT' then trnevents.DT end) as Outtime
, cast(min(trnevents.DT) as date) as date
from trnevents inner join Event_entry on trnevents.EventCatId=Event_entry.EventCatId
group by
emp_reader_id
, cast(trnevents.DT as date)
) as SubQueriesMustBeNamed