簡體   English   中英

使用基於集合的方法在 SQL Server 中按月對所有日期進行分類

[英]Categories all dates by month in SQL Server with set-based approach

我有一個這樣的結果集:

---------------------------
|        AllDates         |
---------------------------
| 2017-05-12 00:00:00.000 |
| 2017-05-14 00:00:00.000 |
| 2017-08-10 00:00:00.000 | 
| 2017-08-13 00:00:00.000 |
| 2018-02-12 00:00:00.000 | 
| 2018-05-15 00:00:00.000 | 
| 2018-05-16 00:00:00.000 |
---------------------------

現在我需要使用 SQL Server 將所有日期分類為以下字符串

--------------------------------------------------
|                   Result                       |
--------------------------------------------------
| May: 12, 14, Aug: 10, 13, Feb: 12, May: 15, 16 |
--------------------------------------------------

在 SQL Server 中不使用用戶定義函數,是否可以僅使用基於集合的方法來實現?

對於 SQL Server 2014,你可以使用這個:

DECLARE @DataSource TABLE
(
    [value] DATETIME2
);

INSERT INTO @DataSource ([value])
VALUES ('2017-05-12 00:00:00.000')
      ,('2017-05-14 00:00:00.000')
      ,('2017-08-10 00:00:00.000')
      ,('2017-08-13 00:00:00.000')
      ,('2018-02-12 00:00:00.000')
      ,('2018-05-15 00:00:00.000')
      ,('2018-05-16 00:00:00.000');

WITH DataSource AS
(
    SELECT YEAR([value]) AS [Year]
          ,MONTH([value]) AS [MonthID]
          ,DATENAME(MONTH, [value]) AS [Month]
          ,DAY([value]) AS [Day]
    FROM @DataSource
),
DataSourceDays AS
(
    SELECT DISTINCT [Year]
                   ,[MonthID]
                   ,[MONTH] + ':' + [value] AS [Days]
    FROM DataSource T
    CROSS APPLY
    (
        SELECT STUFF
        (
            (
                SELECT ',' + CAST([Day] AS VARCHAR(2))
                FROM DataSource S
                WHERE T.[Year] = S.[Year]
                    AND T.[MonthID] = S.[MonthID]
                ORDER BY [Day]
                FOR XML PATH(''), TYPE
            ).value('.', 'VARCHAR(MAX)')
            ,1
            ,1
            ,''
        )
    ) DS([value])
)
SELECT STUFF
(
    (
        SELECT ', ' + CAST([Days] AS VARCHAR(12))
        FROM DataSourceDays
        FOR XML PATH(''), TYPE
    ).value('.', 'VARCHAR(MAX)')
    ,1
    ,2
    ,''
);

在第一個CTE我們獲得了要連接的詳細信息。 在第二個中,我們將每個月和年的日期連接起來。 最后,我們將連接所有先前的結果。


僅供參考,這是使用SQL Server 2017完成的相同操作:

WITH DataSource AS
(
    SELECT YEAR ([value]) AS [Year] 
          ,MONTH([value]) AS [Month]
          ,DATENAME(MONTH, [value]) + ':' + STRING_AGG(DAY([value]), ', ') WITHIN GROUP (ORDER BY [value]) AS [value]
    FROM @DataSource
    GROUP BY YEAR ([value]) 
            ,MONTH([value])
            ,DATENAME(MONTH, [value])
)
SELECT STRING_AGG([value], ' ,') WITHIN GROUP (ORDER BY [Year], [Month])
FROM DataSource;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM