【问题标题】:Get Min In time and Max out TIme. Fom Attendance record in Sql Server获取最小时间和最大时间。 Sql Server 中的考勤记录
【发布时间】:2017-02-15 12:58:20
【问题描述】:

我正在做考勤系统,下面是我在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    |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

【问题讨论】:

  • SQLzim 有一个很好的答案。他们只需要连接入住和退房时间的日期
  • 你是怎么得到这些总数的?你在使用符号值吗?
  • 总时间。你得到 10.646 左右。 10 是小时。取 0.646 * 60 大致得到 38。
  • 您使用的是哪个版本...您标记了 4...删除不适合您的版本的标签。

标签: sql-server sql-server-2008 sql-server-2005 sql-server-2012 sql-server-2008-r2


【解决方案1】:

假设您想要这些特定的时间格式:

rextester:http://rextester.com/FUW31296

create table t (
     EmpCode int
  ,  Date datetime
  ,  WorkDate datetime
  ,  CheckIn datetime
  ,  CheckOut datetime
  ,  TotalTime decimal(19, 9))

insert into t values
 (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);

查询:

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  |
+---------+------------+-------------+-------------+-----------+

【讨论】:

  • 在被删除的答案和更新看起来不错之前,您绝对是在正确的道路上!
  • 谢谢。当我注意到格式不是结果中指定的格式并想在恢复之前进行测试时,我退出了。
  • @xQbert 您个人资料中的帖子链接已被删除:(
  • 哦,好吧。我会删除链接。谢谢。但我会保留交流的要点。我还是觉得很好笑。
  • @xQbert 我同意,希望我能在上下文中看到它。
【解决方案2】:
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

【讨论】:

    【解决方案3】:
    select EmpCode, WorkDate as wrk, min(InTime) as InTime, max(OutTime) as OutTime, Sum(TotalTime) as TotalTime
    from yourtable
    group by EmpCode, WorkDate
    

    将为您提供最小的InTime、最大的OutTimeyourtable 中的总TotalTime,每位用户每天。

    【讨论】:

    • 不要认为这会正确处理第 4 行,因为“Min”签入将是 02:52:38 并且总时间的格式不正确。
    猜你喜欢
    • 2012-12-21
    • 2016-05-26
    • 2010-11-06
    • 2019-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-12
    相关资源
    最近更新 更多