我有一个包含3列的表格。 ID,Start_Date,End_Date.i想要打印Start_Date和End_Date之间的所有日期以及ID。 例如我有表
+----+------------+------------+
| ID | Start_Date | End_Date |
+----+------------+------------+
| 1 | 2017-01-01 | 2017-01-05 |
+----+------------+------------+
我想要像
这样的结果+----+------------+
| ID | Date |
+----+------------+
| 1 | 2017-01-01 |
| 1 | 2017-01-02 |
| 1 | 2017-01-03 |
| 1 | 2017-01-04 |
| 1 | 2017-04-05 |
+----+------------+
答案 0 :(得分:1)
使用公用表表达式:
DECLARE @StartDT DATETIME = '2017-01-01'
DECLARE @EndDT DATETIME = '2017-01-05'
DECLARE @Id INT = 1
;WITH CTE (_id , _Date)AS
(
SELECT @Id , @StartDT
UNION ALL
SELECT @Id , DATEADD(DAY,1,_Date)
FROM CTE
WHERE _Date < @EndDT
)
SELECT * FROM CTE
答案 1 :(得分:0)
创建一个所谓的计数表(参见例如:https://dwaincsql.com/2014/03/27/tally-tables-in-t-sql/)并使用它来创建&#34;来自&#34;之间的所有日期。和&#34;到&#34;日期。
SELECT TOP 1000000 N=IDENTITY(INT, 1, 1)
INTO dbo.Tally
FROM master.dbo.syscolumns a CROSS JOIN master.dbo.syscolumns b;
go
declare @dateFrom datetime = '20170101';
declare @dateTo datetime = '20170105';
select dateadd(day, N - 1, @dateFrom)
from Tally
where N between 1 and datediff(day, @dateFrom, @dateTo) + 1
或者:
select dateadd(day, t.N - 1, o.DateFrom)
from Tally t
cross join OtherTable o
where t.N between 1 and datediff(day, o.DateFrom, o.DateTo) + 1
对于这种情况,计数表非常有用,它也可以在第二列中填充日期,从1900-01-01左右开始。
答案 2 :(得分:0)
DECLARE @StartDT DATETIME = '2017-01-01'
DECLARE @EndDT DATETIME = '2017-01-05'
DECLARE @Id INT = 1
SELECT RANK() OVER (
ORDER BY (SELECT 1)) AS SeqNo
,CAST (Start_Date AS DATE) AS Start_Date
FROM (
SELECT @StartDT + Row_Number() OVER (ORDER BY Rno) - 1 AS Start_Date
FROM (
SELECT ROW_NUMBER() OVER (ORDER BY (SELECT 0)) - 1 AS Rno
FROM master..spt_values
) Dt
) Dt2
WHERE Dt2.Start_Date <= @EndDT
输出
SeqNo Start_Date
--------------------
1 2017-01-01
1 2017-01-02
1 2017-01-03
1 2017-01-04
1 2017-01-05