【问题标题】:How to get the first clock out time and second clock in time for each user SQL如何获取每个用户 SQL 的第一个打卡时间和第二个打卡时间
【发布时间】:2013-12-20 19:18:00
【问题描述】:

我有一个查询,我试图让用户休息时间。我想我可以只使用第一次打卡时间和第二次打卡时间,并使用日期差异来划分每个员工。然而,它正在做的是抓住 FIRST 打卡吃午饭,以及最后一个用户打卡一天。我如何让它按员工列出每个员工的休息时间。以下是我的查询:

SELECT lEmployeeID,
       DATEDIFF(mi, MIN(dtTimeOut), MAX(dtTimeIn)) AS Break_Time
FROM dbo.fTimeCard(@StartDate, @EndDate, @DeptList, @iActive, @EmployeeList) AS ftc
WHERE (TotalHours >= 0)
AND   (DID IS NOT NULL)
OR    (DID IS NOT NULL)
AND   (dtTimeOut IS NULL)
GROUP BY lEmployeeID

【问题讨论】:

  • 真正有用的答案取决于有关您的数据库架构的更多信息。单行包含什么?您是想为所有用户还是只为一个用户安排休息时间?您是否需要仅查看“今天”或过去某个日期或日期范围的休息时间?
  • 大概休息时间是一天中发生的打卡/打卡,因此您需要确定哪些打卡代表实际的早上到达/下午离开,排除那些特定事件,然后将白天的其他进/出事件用作休息时间。
  • 我使用的是日期范围。所有用户的休息时间。用户进出时的 dttimein 和 dttimeout 房屋。所以我 8 点打卡 12 点打卡 1230 点 5 点打卡。我工作了 8.5 小时,休息了 30 分钟
  • 假设员工只休息一次,您的查询应该只针对每个员工进行。您需要按employeeId 和date 分组,即。 date(Timein) 获取每天的结果。此外,将日期时间转换为 24 小时制。执行 datefiff 之前的格式 - DATEDIFF(mi, MIN(convert(datetime,dtTimeOut,9)), MAX(convert(datetime,dtTimeIn,9)))
  • 我认为我们需要查看该表值函数,以及它返回的示例。

标签: sql sql-server tsql sql-server-2005


【解决方案1】:

这远非最有效的方法,但使用我自己的一些测试数据,我能够使用一系列日期数据获得每次休息的分钟数——如果范围在一天的范围内剩余的日期。希望这可能会激发某人想出更好的方法...

输出: 30 60

DECLARE @test TABLE(num INT PRIMARY KEY, activity DATETIME);

INSERT INTO @test(num, activity)
VALUES(77, '2014-01-10 08:00:00'),
(34, '2014-01-10 12:00:00'), (1000, '2014-01-10 12:30:00'), (1, '2014-01-10 18:00:00')
, (34345, '2014-01-10 14:00:00'), (2334, '2014-01-10 15:00:00');


SELECT 
    DATEDIFF(MINUTE, Ordered.activity, offs.offActivity)
FROM 
(
    SELECT
        activity
    FROM
    (
        SELECT 
            ROW_NUMBER() OVER(ORDER BY activity) AS Iteration, num, activity 
        FROM 
            @test As iD1
    ) AS Rowed
    WHERE
        Rowed.iteration % 2 = 0
) AS Ordered
    CROSS APPLY
(
    SELECT TOP 1
        activity as offActivity
    FROM
        @test iD
    WHERE
        iD.activity > Ordered.activity
    ORDER BY 
        activity
) As Offs

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-08
    • 2017-11-28
    • 1970-01-01
    • 2019-09-13
    • 1970-01-01
    • 2022-11-13
    相关资源
    最近更新 更多