sql - 在 SQL Server 中获取日期范围内的所有日期

标签 sql sql-server-2005 tsql datetime date-range

我从一个被问到的 StackOverflow 问题中得到了这个例子,但我无法根据我的需要让它工作。

WITH DateTable
AS
(
    SELECT CAST('20110101' as Date) AS [DATE]
    UNION ALL
    SELECT DATEADD(dd, 1, [DATE]) FROM DateTable 
    WHERE DATEADD(dd, 1, [DATE]) < cast('20110131' as Date)
)
SELECT dt.[DATE] FROM [DateTable] dt

输入-

ID |   FromDate  | ToDate
=============================
1  |  2011-11-10 | 2011-11-12
2  |  2011-12-12 | 2011-12-14

输出 -

SN |   Dates     | 
==================
1  |  2011-11-10 | 
2  |  2011-11-11 | 
3  |  2011-11-12 | 
4  |  2011-12-12 | 
5  |  2011-12-13 | 
6  |  2011-12-14 |

查看此代码适用于静态日期。但就我而言,我有一个包含三列 Id、FromDate、ToDate 的表。现在我想将每一行中的每个范围转换为单独的日期。

如果范围来自表,并且显然必须为范围表中的每一行运行此查询,我无法让上面的示例工作,这是另一个令人困惑的挑战。

请帮忙。

最佳答案

在数字表的帮助下。

declare @T table
(
  ID int identity primary key,
  FromDate date,
  ToDate date
)

insert into @T values
('2011-11-10', '2011-11-12'),
('2011-12-12', '2011-12-14')

select row_number() over(order by D.Dates) as SN,
       D.Dates
from @T as T
  inner join master..spt_values as N
    on N.number between 0 and datediff(day, T.FromDate, T.ToDate)
    cross apply (select dateadd(day, N.number, T.FromDate)) as D(Dates)
where N.type ='P'

试穿SE Data

关于sql - 在 SQL Server 中获取日期范围内的所有日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9140308/

相关文章:

php - 如何根据用户选择的下拉菜单更改 PHP 中的 SQL 查询

sql - 在存储过程中执行存储过程

sql - SSIS OlEDB 连接管理器错误

SQL Server : update multiple rows dynamically

sql-server - SQL Server表使用情况统计

mysql - 在表中查找过去几周没有事件的记录

sql - 如何在 postgresql 中以不同方式更新共享相同 id 的每一行?

sql - 在 PL\SQL block 中使用 EXECUTE IMMEDIATE

sql-server - 动态设置 ORDER BY,无需字符串连接

sql-server - TSQL可以从 bool 值转换为BIT吗