如何在SQL Server中实现这一点?
如何在SQL Server中执行此操作 我有一张这样的桌子: 表1如何在SQL Server中实现这一点?,sql,sql-server,tsql,Sql,Sql Server,Tsql,如何在SQL Server中执行此操作 我有一张这样的桌子: 表1 userid datetime date inoutmode ----------------------------------------------------- 123 2018-02-02 14:11:14 2018-02-02 0 123 2018-02-02 18:52:44 2018-02-02 1 12
userid datetime date inoutmode
-----------------------------------------------------
123 2018-02-02 14:11:14 2018-02-02 0
123 2018-02-02 18:52:44 2018-02-02 1
123 2018-02-05 09:10:07 2018-02-05 0
如何按日期将其放在一行中,如下所示:
userid date intime inmod outtime outmod
--------------------------------------------------------------------------
123 2018-02-02 14:11:14 0 18:52:44 1
123 2018-02-05 09:10:07 0 (null) or 00:00:00 (null) or (9)
根据您的输入,您可以通过以下方式实现:
;WITH Table1
AS (
SELECT 123 userid
,CAST('2018-02-02 14:11:14' AS DATETIME) [datetime]
,CAST('2018-02-02' AS DATE) [date]
,0 inoutmode
UNION ALL
SELECT 123 userid
,CAST('2018-02-02 18:52:44' AS DATETIME) [datetime]
,CAST('2018-02-02' AS DATE) [date]
,1 inoutmode
UNION ALL
SELECT 123 userid
,CAST('2018-02-05 09:10:07' AS DATETIME) [datetime]
,CAST('2018-02-05' AS DATE) [date]
,0 inoutmode
)
SELECT [in].userid
,[in].[date]
,intime = CONVERT(TIME, CONVERT(VARCHAR(10), [in].[datetime], 108))
,inmod = [in].inoutmode
,outtime = ISNULL(CONVERT(TIME, CONVERT(VARCHAR(10), [out].[datetime], 108)), '00:00:00')
,outmod = ISNULL([out].inoutmode, 9)
FROM Table1 [in]
LEFT JOIN Table1 [out] ON [in].userid = [out].userid
AND [in].DATETIME < [out].DATETIME
AND [out].inoutmode = 1
WHERE [in].inoutmode = 0
您可以使用分组方式
结果:
userid date intime inmod outtime outmod
----------- ---------- -------- ----------- -------- -----------
123 2018-02-02 14:11:14 0 18:52:44 1
123 2018-02-05 09:10:07 0 00:00:00 9
您是否希望在插入表1时自动插入该行?还是要从查询表1手动插入到表2中?或者表2是查询结果?根据用户和日期,最多显示两行,一行用于inoutmode 0,一行用于inoutmode 1。这是肯定的还是会有更多?如果更多,怎么办?获取最早的时间还是最晚的时间?附带说明:您不应该重复存储日期。日期已经包含在datetime列中,因此请删除date列以规范化表并避免将来出现不一致的问题。或者日期栏是计算栏?@alz_mohd请更新您问题的标题。标题“如何在SQL Server中做到这一点”对任何未来的访问者都毫无帮助,ever.hi all感谢回答表1插入fingerdevice自动考勤员工的数据如果我想为来或不来的员工制作报告并将结果插入另一个表中如何操作?您可以将插入添加到上述选择查询中,如插入到表2 col1、col2,。。。选择来自表1
DECLARE @table1 TABLE(userid INT, [datetime] datetime, [date] date, inoutmode INT)
INSERT INTO @table1 VALUES
(123, '2018-02-02 14:11:14', '2018-02-02', 0 ),
(123, '2018-02-02 18:52:44', '2018-02-02', 1 ),
(123, '2018-02-05 09:10:07', '2018-02-05', 0 )
select
userid,
[date],
isnull( cast( min( case when inoutmode = 0 then [datetime] end ) as time ), '00:00:00') intime,
isnull( min( case when inoutmode = 0 then inoutmode end ) , 0 ) inmod,
isnull( cast( max( case when inoutmode = 1 then [datetime] end ) as time ), '00:00:00') outtime,
isnull( max( case when inoutmode = 1 then inoutmode end ) , 9 ) outmod
from @table1
group by
userid, [date]
userid date intime inmod outtime outmod
----------- ---------- -------- ----------- -------- -----------
123 2018-02-02 14:11:14 0 18:52:44 1
123 2018-02-05 09:10:07 0 00:00:00 9