перечислить дни недели в т-квл - PullRequest
2 голосов
/ 26 января 2011

Кто-нибудь должен знать, как перечислять все дни недели в T-SQL, чтобы в выводе была строка типа «Воскресенье, понедельник, вторник, ...»

Ответы [ 3 ]

6 голосов
/ 26 января 2011
WITH    week (dn) AS
        (
        SELECT  1
        UNION ALL
        SELECT  dn + 1
        FROM    week
        WHERE   dn < 7
        )
SELECT  DATENAME(dw, dn + 5) 
FROM    week

Замените dn + 5 на dn + 6, если ваша неделя начинается с Monday.

Если вам нужна одна строка, разделенная запятыми, а не набор, используйте это:

WITH    week (dn, dname) AS
        (
        SELECT  1, CAST(DATENAME(dw, 6) AS NVARCHAR(MAX))
        UNION ALL
        SELECT  dn + 1, dname + ', ' + DATENAME(dw, dn + 6)
        FROM    week
        WHERE   dn < 7
        )
SELECT  dname
FROM    week
WHERE   dn = 7
1 голос
/ 26 января 2011

Самый быстрый способ - статически определить список через запятую.Я не знаю, влияет ли SET DATEFIRST только на базу данных - если это будет весь экземпляр, я действительно не решусь использовать SET DATEFIRST.

Вместо того, чтобы использовать рекурсию, вы можете использовать значения из MASTER ..SPT_VALUES и сочетание функций STUFF и FOR XML PATH (Предупреждение: SQL Server 2005 +):

Неделя, начинающаяся в воскресенье:

SELECT STUFF((SELECT ', ' + x.wkday_name 
                FROM (SELECT DISTINCT DATENAME(dw, t.number) AS wkday_name, 
                             t.number
                        FROM MASTER.dbo.SPT_VALUES t
                       WHERE t.number BETWEEN -1 AND 5) x
                    ORDER BY x.number
                     FOR XML PATH ('')), 1, 2, '')

Неделя, начинающаяся с понедельника:

SELECT STUFF((SELECT ', ' + x.wkday_name 
                FROM (SELECT DISTINCT DATENAME(dw, t.number) AS wkday_name, 
                             t.number
                        FROM MASTER.dbo.SPT_VALUES t
                       WHERE t.number BETWEEN 0 AND 6) x
                    ORDER BY x.number
                     FOR XML PATH ('')), 1, 2, '')

Сравнение:

Статически определенный список не возвращает план запроса для меня на SQL Server 2005. Пример рекурсии Quassnoi в 2005 году имеетстоимость поддерева 0,0000072;SPT_VALUES имеет стоимость поддерева 0,0158108.Таким образом, рекурсивный подход выглядит более эффективным, чем SPT_VALUES - возможно, из-за очень маленького размера?

1 голос
/ 26 января 2011

Прямой выбор, который будет работать с любой SET DATEFIRST настройкой

select
    datename(dw,   6-@@datefirst) + ', ' +
    datename(dw, 1+6-@@datefirst) + ', ' +
    datename(dw, 2+6-@@datefirst) + ', ' +
    datename(dw, 3+6-@@datefirst) + ', ' +
    datename(dw, 4+6-@@datefirst) + ', ' +
    datename(dw, 5+6-@@datefirst) + ', ' +
    datename(dw, 6+6-@@datefirst)

Если вам не важен регион (понедельник или воскресенье - первый день недели), просто

select
    datename(dw, 0) + ', ' + datename(dw, 1) + ', ' +
    datename(dw, 2) + ', ' + datename(dw, 3) + ', ' +
    datename(dw, 4) + ', ' + datename(dw, 5) + ', ' +
    datename(dw, 6) + ', '

Он будет работать намного лучше, чем проходить CTE, а также будет работать в 2000 году, если он вам когда-нибудь понадобится.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...