是否有人知道如何在T-SQL中枚举所有星期的日子,以便我们在输出中包含如下字符串:'星期日,星期一,星期二......'
答案 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中的值以及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上为我返回查询计划。2005年Quassnoi的递归示例的子树成本为0.0000072; SPT_VALUES的子树成本为0.0158108。因此,递归方法似乎比SPT_VALUES更有效 - 可能是由于尺寸非常小?