如何在SQL Server 2012中将日期时间列拆分为日期列和串联时间(对于同一日期)列

如何在SQL Server 2012中将日期时间列拆分为日期列和串联时间(对于同一日期)列,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有一个datetime列,同一日期有几个小时。我想在一列中设置日期,而不重复,在另一列中设置连接的小时数 表格结构为: USERID CHECKTIME ----------------------------- 89 02/02/2021 05:06:07 89 02/02/2021 09:07:08 89 02/02/2021 12:15:20 89 03/02/2021 10:11:12 我想要的输出是: DATE

我有一个
datetime
列,同一日期有几个小时。我想在一列中设置日期,而不重复,在另一列中设置连接的小时数

表格结构为:

USERID    CHECKTIME
-----------------------------
89        02/02/2021 05:06:07
89        02/02/2021 09:07:08
89        02/02/2021 12:15:20
89        03/02/2021 10:11:12
我想要的输出是:

DATE          HOURS
------------------------------------------
02/02/2021    05:06:07, 09:07:08, 12:15:20
03/02/2021    10:11:12
我尝试了以下查询,但是,所有行的小时数都是相同的。我知道这是因为我将这些值指定为文字,但是,我找不到如何对查询进行编码,因此,每个不同的日期的小时数都会连接在一起:

SELECT DISTINCT 
    FORMAT(CHECKTIME,'dd/MM/yyyy') AS DATE,
    STUFF((SELECT ', '  + FORMAT(CHECKTIME, 'HH:mm:ss') 
           FROM dbo.CHECKINOUT_PD
           WHERE FORMAT(CHECKTIME, 'dd/MM/yyyy') = '02/02/2021' 
             AND USERID = 89
           FOR XML PATH ('')), 1, 2, '') AS HOURS
FROM 
    dbo.CHECKINOUT_PD
WHERE 
    FORMAT(CHECKTIME, 'MM/yyyy') = '02/2021' 
    AND USERID = 89
我将感谢任何提供的帮助


提前谢谢你

您只需要将内部查询与外部查询关联起来

请注意,
format
非常昂贵,应尽可能避免使用,尤其是在
where
子句中使用时,最好在本机数据类型而不是字符串中进行比较

declare @Test table (UserId int, CheckTime datetime2(0))

insert into @Test (UserId, CheckTime)
values
(89, '02/02/2021 05:06:07'),
(89, '02/02/2021 09:07:08'),
(89, '02/02/2021 12:15:20'),
(89, '03/02/2021 10:11:12');

SELECT CAST(CHECKTIME AS date) AS [DATE]
    , STUFF((
        SELECT ', '  + FORMAT(T2.CHECKTIME, 'HH:mm:ss') 
        FROM @Test T2
        WHERE CAST(T2.CHECKTIME AS date) = CAST(T1.CHECKTIME AS date)
        AND T1.USERID = T2.USERID
        FOR XML PATH ('')
    ), 1, 2, '') AS [HOURS]
FROM @Test T1
WHERE T1.USERID = 89
GROUP BY T1.USERID, CAST(T1.CHECKTIME AS date);
您可以使用(如果使用SQL Server 2017+)


注意:如果您将示例数据的DDL+DML添加到将来的问题中,将更容易提供帮助。

您使用的是哪个版本的SQL Server?进展如何?我正在使用SQL Server 2012,我在问题标题中指出了这一点。此解决方案非常有效,谢谢!另外,感谢您提供有关使用“格式”的提示,我会记住这一点。
SELECT CAST(CHECKTIME AS date) AS [DATE]
    , STRING_AGG(FORMAT(T1.CHECKTIME, 'HH:mm:ss'),', ') WITHIN GROUP (order by T1.CHECKTIME asc) [HOURS]
FROM @Test T1
WHERE T1.USERID = 89
GROUP BY T1.USERID, CAST(T1.CHECKTIME AS date);