我对当前月份的日子感兴趣。以下代码是我如何递归执行此操作的方法:
WITH AllMonthDays as (
SELECT n = 1
UNION ALL
SELECT n + 1 FROM AllMonthDays WHERE n + 1 <= DAY(EOMONTH(GETDATE()))
)
SELECT
datefromparts(YEAR(GETDATE()), MONTH(GETDATE()), n) as dates
FROM AllMonthDays;
我理解上述可能不是最佳的。但我的问题是如何以非递归方式实现上述目标,而不是对任何日期进行硬编码。
编辑:由于“Gordon Linoff”的建议,完全删除了 CAST 到 VCHAR。
最佳答案
通常,名为 master..spt_values
的表用于此目的。它没有文档记录,但通常可用。实际上,任何至少有 31 行的表都可以使用。
因此,要生成数字并构造日期:
with n as (
select top 31 row_number() over (order by (select null)) as n
from master..spt_values
)
select datefromparts(year(getdate()), month(getdate()), n.n) as thedate
from n
where n.n <= day(eomonth(getdate()));
注意:datefromparts()
是构造日期的一种非常方便的方法。此外,当您在 SQL Server 中使用 varchar
时,始终包含长度。默认值因上下文而异,并且查找由此问题引起的错误可能相当困难。
关于sql - 如何使用非递归方法创建该月所有天的列表? (提供递归示例),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34417599/