【问题标题】:Concatenating multiple dates into a single varchar cell [duplicate]将多个日期连接到一个 varchar 单元格中[重复]
【发布时间】:2013-11-25 21:01:32
【问题描述】:

我已将这个问题改写为更直截了当。我有一个 SQL 查询:

SELECT CAST(CASE WHEN DTH.DoubleBookedFlag = 1 THEN DTH.ActivityDate END AS VARCHAR(MAX)) AS DoubleBookedHours
FROM DailyTaskHours DTH
WHERE DTH.DoubleBookedFlag = 1

结果如下:

我希望返回的不是多行,而是单个 VARCHAR 字段中的一个长连接字符串,由 | 之类的字符分隔。

我怎样才能做到这一点?

【问题讨论】:

标签: sql sql-server


【解决方案1】:

您可以使用类似于以下内容的内容附加到 varchar。顺便说一句,您的代码中的 CASE 语句是不必要的。双重预订标志将始终为 1,因为您在 WHERE 子句中指定了这一点。

DECLARE @test varchar(max) 
SELECT @test = ''

SELECT @test = @test + '|' + CONVERT(varchar, DTH.ActivityDate, 101)  FROM DailyTaskHours DTH

SELECT @test

【讨论】:

    【解决方案2】:
    SELECT DTH.ActivityDate, STUFF(List, 1 ,2, '')
     FROM DailyTaskHours DTH
                    CROSS APPLY ( SELECT ', ' + CAST(DTH.ActivityDate AS NVARCHAR) [text()]
                                  FROM DailyTaskHours
                                  WHERE DTH.ActivityDate = 1 
                                  AND SomeRefrencingColum = DTH.SomeRefrencingColum
                                  FOR XML PATH('')
                                ) Q(List)
    

    【讨论】:

    • 这仍然返回多行。
    【解决方案3】:

    您可以使用 GROUP_CONCAT 函数来获取一个字段中的结果,如下所示,

    SELECT GROUP_CONCAT(
            (CASE WHEN DTH.DoubleBookedFlag=1 THEN DTH.ActivityDate END)
         SEPARATOR ' | ') 
    as DailyTaskHours
    FROM 
      DailyTaskHours as DTH
    WHERE 
       DTH.DoubleBookedFlag = 1
    

    此外,下面的查询也会给出相同的结果,不需要 CASE 来获得输出,因为我们在 Where 子句中指定了相同的条件

    SELECT GROUP_CONCAT(DTH.ActivityDate SEPARATOR ' | ') as DailyTaskHours
    FROM 
    DailyTaskHours as DTH
    WHERE 
    DTH.DoubleBookedFlag = 1
    

    http://sqlfiddle.com/#!2/19651/23 上两个查询的演示

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-22
      • 2021-08-26
      • 2010-11-12
      • 1970-01-01
      • 2017-09-04
      • 2021-12-31
      • 2022-07-09
      • 2020-03-30
      相关资源
      最近更新 更多