sql - 如何使用非递归方法创建该月所有天的列表? (提供递归示例)

标签 sql recursion sql-server-2012

我对当前月份的日子感兴趣。以下代码是我如何递归执行此操作的方法:

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/

相关文章:

sql - 如何测试 SQL "CREATE TABLE"语句是否等效于现有表?

c++ - 在 C++ 中的特定递归调用中执行语句

C - 不循环地递归查找子集和

sql-server-2012 - SQL Server 2012 FileTable- 是存储在数据库中的文件吗?

php - MySQL 的大量锁定查询

sql - 如何对 Apache Hive SQL 代码执行 SonarQube 分析?

java - 搜索未排序树的特定节点

sql-server - SQL : Recursive search for each row

sql-server - tsql 登录失败但管理工作室可以连接

sql - 如何简单地加入 Rails 中的 n 对 n 关联?