5-18打卡

Posted wlxdaydayup

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了5-18打卡相关的知识,希望对你有一定的参考价值。

递归写爬楼梯

#include <stdio.h>

// 定义一个函数,用来打印每次爬的台阶数
void print_steps(int steps[], int n) 
    printf("一种可能的方法是:");
    for (int i = 0; i < n; i++) 
        printf("%d ", steps[i]);
    
    printf("\\n");


// 定义一个递归函数,用来求解所有可能的方法
void climb_stairs(int n, int steps[], int index) 
    // 如果只有一个或两个台阶,直接打印结果
    if (n == 1) 
        steps[index] = 1;
        print_steps(steps, index + 1);
     else if (n == 2) 
        steps[index] = 1;
        print_steps(steps, index + 1);
        steps[index] = 2;
        print_steps(steps, index + 1);
     else 
        // 如果有多于两个台阶,可以先爬一个或两个台阶,然后递归求解剩下的台阶
        steps[index] = 1;
        climb_stairs(n - 1, steps, index + 1);
        steps[index] = 2;
        climb_stairs(n - 2, steps, index + 1);
    


int main() 
    int n; // 输入台阶数
    printf("请输入台阶数:");
    scanf("%d", &n);
    int steps[n]; // 定义一个数组,用来存储每次爬的台阶数
    climb_stairs(n, steps, 0); // 调用递归函数,求解所有可能的方法
    return 0;



从 SQL Server 中的多个打卡或多个打卡中获取打卡和打卡时间

【中文标题】从 SQL Server 中的多个打卡或多个打卡中获取打卡和打卡时间【英文标题】:Get Clock In and clock out time from multiple clock in or multiple clock out in SQL Server 【发布时间】:2019-05-23 06:44:30 【问题描述】:

我正在使用 Web 应用程序来管理员工的上班/下班时间以及计划班次的映射。

注意 LogType 1 表示时钟输入,2 表示时钟输出。

我的登录表结构如下

UserId       LogDateTime             LogType

 5005    2019-05-20 21:35:48.490        1
 5005    2019-05-20 22:25:00.000        1
 5005    2019-05-21 06:48:00.000        2
 5005    2019-05-21 07:01:15.383        2

 5006    2019-05-20 21:25:25.470        1
 5006    2019-05-20 23:48:29.568        2
 5006    2019-05-21 00:07:05.056        1
 5006    2019-05-21 07:25:35.853        2

 5007   2019-05-20 23:33:35.017         1
 5007   2019-05-21 00:18:56.087         2
 5007   2019-05-21 09:01:23.577         2

我想以以下格式获取时钟输入和时钟输出并将其用于计划班次的映射

UserId      Date            ClockIn                    ClockOut
5005      2019-05-20     2019-05-20 21:35:48.490     2019-05-21 07:01:15.383
5006      2019-05-20     2019-05-20 21:25:25.470     2019-05-21 07:25:35.853
5007      2019-05-21     2019-05-20 23:33:35.017     2019-05-21 09:01:23.577 

任何人都可以为此共享查询。

【问题讨论】:

你可以有多个打卡没有打卡?为什么5006 没有在 2 个不同的日期报告?请用逻辑更新问题 您能否再解释一下Date 列的逻辑。 2019-05-20 for UserId 50052019-05-21 for UserId 5007 怎么样? 请在您的问题中提供更多详细信息,查看发布的答案并在需要时向其发布 cmets,或者删除您的问题。 【参考方案1】:

试试这个,&lt;myTable&gt;需要换成实际的表名:

SELECT 
    UserId,
    CONVERT(CHAR(10), LogDateTime, 126) AS Date,
    LogDateTime AS ClockIn,
    -- this sub query will by using WHERE clause, ORDER BY, TOP 1
    -- get the closest CheckOut time for the same user
    (
        SELECT TOP 1 LogDateTime 
        FROM <myTable> AS t2 
        WHERE t2.UserId = t1.UserId 
              AND t2.LogDateTime > t1.LogDateTime
              AND LogType = 2
        ORDER BY LogDateTime ASC
    )  AS ClockOut
FROM <myTable> AS t1 
WHERE LogType = 1
    -- this sub query is to limit the result to only the latest CheckIn times
    AND t1.LogDateTime IN
    (
        SELECT MAX(t3.LogDateTime)
        FROM <myTable> AS t3
        WHERE t3.UserId = t1.UserId
          AND LogType = 1
    ) 

希望对你有帮助!

【讨论】:

OP 也需要选择日期列,我们需要更多解释(如 Arulkumar 的评论),因为日期是 Min()5005Max()5007 好吧,我写了一个我认为用户可能想要的答案。查询非常复杂(它需要很复杂,但可以用其他方式编写)。此外查询可能没有很好的性能,但它应该是一个开始【参考方案2】:

我假设Date 列背后的逻辑正在考虑用户分配签入和签出的日期,如果用户仅分配签入或仅签出,则该记录将被忽略(在实际生活中,可能会发生用户忘记)

无论如何,您应该使用MIN()MAX()Group ByHaving 作为下一个

我认为我的代码更好,但至少我的代码满足了需求

演示:-

Create table #MyTempTable (UserId int , LogDateTime Datetime,LogType int)

Insert into #MyTempTable values (5005,'2019-05-20 21:35:48.490',1)
Insert into #MyTempTable values (5005,'2019-05-20 22:25:00.000',1)
Insert into #MyTempTable values (5005,'2019-05-21 06:48:00.000',2)
Insert into #MyTempTable values (5005,'2019-05-21 07:01:15.383',2)
Insert into #MyTempTable values (5006,'2019-05-20 21:25:25.470',1)
Insert into #MyTempTable values (5006,'2019-05-20 23:48:29.568',2)
Insert into #MyTempTable values (5006,'2019-05-21 00:07:05.056',1)
Insert into #MyTempTable values (5006,'2019-05-21 07:25:35.853',2)
Insert into #MyTempTable values (5007,'2019-05-20 23:33:35.017',1)
Insert into #MyTempTable values (5007,'2019-05-21 00:18:56.087', 2)
Insert into #MyTempTable values (5007,'2019-05-21 09:01:23.577',2)

select UserId,min(Date) Date ,min(ClockIn) ClockIn ,Max(ClockOut) ClockOut 
from (
    select UserId, Min(convert(date,LogDateTime)) Date, 
    Min(LogDateTime) ClockIn , Max(LogDateTime) ClockOut,LogType
    from #MyTempTable
    Group by UserId,LogType
    having count(convert(date,LogDateTime)) > 1
    )t
Group by UserId

Drop table #MyTempTable

结果:-

UserId  Date        ClockIn                 ClockOut
5005    2019-05-20  2019-05-20 21:35:48.490 2019-05-21 07:01:15.383
5006    2019-05-20  2019-05-20 21:25:25.470 2019-05-21 07:25:35.853
5007    2019-05-21  2019-05-21 00:18:56.087 2019-05-21 09:01:23.577

【讨论】:

由于某些原因,您的解决方案似乎不起作用。首先,您没有注意ClockInClockOut 的日期,因此结果将在ClockInClockOut 中具有不同的日期,这是不可接受的跨度> 冷静点兄弟,这是不可接受的谁?!我使用的数据演示不是虚拟数据,它是来自 OP 的输入,我重新缓存的结果与 OP 由于他/她的问题而寻找的结果相同。最后我写了一个我认为有帮助的答案。 也许对他有帮助,但对其他读者(他们正在寻找解决方案)没有帮助。

以上是关于5-18打卡的主要内容,如果未能解决你的问题,请参考以下文章

SQL如何判断打卡记录是不是异常?

从 SQL Server 中的多个打卡或多个打卡中获取打卡和打卡时间

打卡无效此记录已被更新会罚款吗

学习打卡功能上线,告别懒惰,坚持学习!

员工考勤打卡时,如何避免非本人代替打卡?

指纹的打卡机是否插电就可以?用连接电脑么?