如何在SQL Server中实现这一点?

如何在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

如何在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 
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