将两个日期时间列的Stuff()分隔成逗号分隔的列表

时间:2018-04-20 15:54:32

标签: sql sql-server

我有两条记录,我想在SQL服务器中填充日期。

CREATE TABLE #TEMP1
(
SALE_DT DATETIME,
ID INT
)
INSERT INTO #TEMP1 VALUES ('1/12/2011 12:00 AM','12345')
INSERT INTO #TEMP1 VALUES ('3/11/2011 12:00 AM','12345')

当我尝试下面的查询时,我有一个“将varchar数据类型转换为日期时间数据类型导致超出范围的值。”

SELECT
STUFF(ISNULL((SELECT ', ' + X.SALE_DT 
FROM #TEMP1 X WHERE X.ID = T.ID
GROUP BY X.SALE_DT FOR XML PATH ('')), ''), 1, 2, '') AS DATES
FROM #TEMP1 T

当我尝试下面的查询时,我能够填写日期,但结果不是我想要的

SELECT DISTINCT
STUFF(ISNULL((SELECT ', ' + CONVERT(VARCHAR, X.SALE_DT) 
FROM #TEMP1 X WHERE X.ID = T.ID
GROUP BY X.SALE_DT FOR XML PATH ('')), ''), 1, 2, '') AS DATES,
ID
FROM #TEMP1 T

我希望我的结果如下:

SALE_DT              ID
1/12/2011, 3/11/2011 12345

1 个答案:

答案 0 :(得分:2)

我认为这应该做你想要的:

SELECT ID,
        STUFF( (SELECT ', ' + CONVERT(VARCHAR(10), X.SALE_DT) 
                FROM #TEMP1 X
                WHERE X.ID = T.ID
                FOR XML PATH ('')
               ), 1, 2, ''
             ) AS DATES
FROM (SELECT DISTINCT ID FROM #TEMP1 T) T;

注意:

  • 始终在SQL Server中提供VARCHAR的长度。默认长度因上下文而异,可能不够。
  • 根据您的示例数据,子查询中不需要GROUP BY。在这种情况下,我更倾向于使用SELECT DISTINCT,但他们做同样的事情。
  • 同样,我认为没有理由用空字符串替换NULL值。当然,如果你真的想避免使用COALESCE(),你可以使用NULL
  • 在子查询中执行SELECT DISTINCT ID应该是性能优化 - 子查询每id只运行一次。
  • VARCHAR(10)只会在您拥有的国际化设置中带回日期。您可能应该使用FORMAT()或显式转换代码。