枚举t-sql中的星期几

时间:2011-01-26 11:57:49

标签: sql sql-server tsql

是否有人知道如何在T-SQL中枚举所有星期的日子,以便我们在输出中包含如下字符串:'星期日,星期一,星期二......'

3 个答案:

答案 0 :(得分:6)

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 :(得分:1)

直接选择适用于任何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年起作用。

答案 2 :(得分:1)

最快的方法是静态定义逗号分隔列表。我不知道SET DATEFIRST是否只影响数据库 - 如果它是整个实例,我会毫不犹豫地使用SET DATEFIRST。

您可以使用MASTER..SPT_VALUES中的值以及STUFFFOR 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上为我返回查询计划。2005年Quassnoi的递归示例的子树成本为0.0000072; SPT_VALUES的子树成本为0.0158108。因此,递归方法似乎比SPT_VALUES更有效 - 可能是由于尺寸非常小?