打卡
Posted Hugo-Martin
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了打卡相关的知识,希望对你有一定的参考价值。
1.问题:
魔术师利用一副牌中的13张黑桃,预先将它们排好后迭在一起,并使牌面朝下。然后他对观众说:我不看牌,只要数数就可以猜到每张牌是什么,我大声数数,你们听,不信?
你们就看,魔术师将最上面的那张牌数为1,把它翻过来正好是黑桃A,他将黑桃A放在桌子上,然后按顺序从上到下数手中的余牌,第二次数1、2,将第一张牌放在这迭牌的下面,将第二张牌翻过来,正好是黑桃2,也将它放在桌子上,第三次数1、2、3,将前面两张依次放在这迭牌的下面,再翻第三张牌正好是黑桃3,这样依次进行,将13张牌全部翻出来,准确无误。问魔术师手中的牌原始次序是怎样安排的?
2.思路:根据问题分析,使用循环结构来实现程序。使用程序将分析过程模拟出来,就可以计算出魔术师手中牌的原始次序。由于有13张牌,因此显然要循环13次,每次循环时找到与牌序号对应的那个空盒子,因此循环体完成的功能就是找到对应的空盒子将牌存入。
3.程序流程图:
4.代码实现:
#include
int a[14];
int main()
int i, j=1, n;
printf("魔术师手中的牌原始次序是:\\n");
for( i=1; i<=13; i++ )
n=1;
do
if(j>13)
j=1;
if(a[j])
j++;
else
if(n==i)
a[j]=i;
j++;
n++;
while(n<=i);
for( i=1; i<=13; i++ )
printf("%d ", a[i]);
printf("\\n");
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 由于他/她的问题而寻找的结果相同。最后我写了一个我认为有帮助的答案。
也许对他有帮助,但对其他读者(他们正在寻找解决方案)没有帮助。以上是关于打卡的主要内容,如果未能解决你的问题,请参考以下文章