sql server打印两个日期列之间的所有日期

时间:2017-06-09 06:45:30

标签: sql sql-server

我有一个包含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 |
+----+------------+

3 个答案:

答案 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