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 5005
和 2019-05-21
for UserId 5007
怎么样?
请在您的问题中提供更多详细信息,查看发布的答案并在需要时向其发布 cmets,或者删除您的问题。
【参考方案1】:
试试这个,<myTable>
需要换成实际的表名:
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()
和 5005
和 Max()
和 5007
!
好吧,我写了一个我认为用户可能想要的答案。查询非常复杂(它需要很复杂,但可以用其他方式编写)。此外查询可能没有很好的性能,但它应该是一个开始【参考方案2】:
我假设Date
列背后的逻辑正在考虑用户分配签入和签出的日期,如果用户仅分配签入或仅签出,则该记录将被忽略(在实际生活中,可能会发生用户忘记)
无论如何,您应该使用MIN()
、MAX()
、Group By
和Having
作为下一个
我认为我的代码更好,但至少我的代码满足了需求
演示:-
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
【讨论】:
由于某些原因,您的解决方案似乎不起作用。首先,您没有注意ClockIn
和ClockOut
的日期,因此结果将在ClockIn
和ClockOut
中具有不同的日期,这是不可接受的跨度>
冷静点兄弟,这是不可接受的谁?!我使用的数据演示不是虚拟数据,它是来自 OP 的输入,我重新缓存的结果与 OP 由于他/她的问题而寻找的结果相同。最后我写了一个我认为有帮助的答案。
也许对他有帮助,但对其他读者(他们正在寻找解决方案)没有帮助。以上是关于5-18打卡的主要内容,如果未能解决你的问题,请参考以下文章