代码之家  ›  专栏  ›  技术社区  ›  dcp

t-sql获取两个日期之间的所有日期[重复]

  •  17
  • dcp  · 技术社区  · 14 年前

    可能重复:
    Getting Dates between a range of dates

    假设我有两个日期(仅日期部分,没有时间),我想获取这两个日期之间的所有日期(包括这两个日期),并将它们插入表中。有没有一种简单的方法可以用SQL语句来实现(即没有循环)?

    Ex:
    Date1: 2010-12-01
    Date2: 2010-12-04
    
    Table should have following dates:
    2010-12-01, 2010-12-02, 2010-12-03, 2010-12-04
    
    4 回复  |  直到 7 年前
        1
  •  50
  •   OMG Ponies    14 年前

    假设使用SQL Server 2005+,则使用递归查询:

    WITH sample AS (
      SELECT CAST('2010-12-01' AS DATETIME) AS dt
      UNION ALL
      SELECT DATEADD(dd, 1, dt)
        FROM sample s
       WHERE DATEADD(dd, 1, dt) <= CAST('2010-12-04' AS DATETIME))
    SELECT * 
      FROM sample
    

    返回:

     dt
     ---------
     2010-12-01 00:00:00.000
     2010-12-02 00:00:00.000
     2010-12-03 00:00:00.000
     2010-12-04 00:00:00.000
    

    CAST/CONVERT to format as you like .

    使用开始和结束参数:

    INSERT INTO dbo.YOUR_TABLE
      (datetime_column)
    WITH sample AS (
        SELECT @start_date AS dt
        UNION ALL
        SELECT DATEADD(dd, 1, dt)
          FROM sample s
         WHERE DATEADD(dd, 1, dt) <= @end_date)
    SELECT s.dt
      FROM sample s
    
        2
  •  18
  •   Community CDub    7 年前

    你需要一张数字表。如果你没有一个永久的 a more efficient

    DECLARE @D1 DATE = '2010-12-01'
    DECLARE @D2 DATE = '2010-12-04'
    
    ;WITH 
    L0 AS (SELECT 1 AS c UNION ALL SELECT 1),
    L1 AS (SELECT 1 AS c FROM L0 A CROSS JOIN L0 B),
    L2 AS (SELECT 1 AS c FROM L1 A CROSS JOIN L1 B),
    L3 AS (SELECT 1 AS c FROM L2 A CROSS JOIN L2 B),
    L4 AS (SELECT 1 AS c FROM L3 A CROSS JOIN L3 B),
    Nums AS (SELECT ROW_NUMBER() OVER (ORDER BY (SELECT 0)) AS i FROM L4)
    SELECT DATEADD(day,i-1,@D1)
     FROM Nums where i <= 1+DATEDIFF(day,@D1,@D2)
    
        3
  •  6
  •   ChrisLively    14 年前

    我只是做了这样的事:

    declare @dt datetime = '2010-12-01'
    declare @dtEnd datetime = '2010-12-04'
    
    WHILE (@dt < @dtEnd) BEGIN
        insert into table(datefield)
            values(@dt)
        SET @dt = DATEADD(day, 1, @dt)
    END
    
        4
  •  3
  •   Community CDub    7 年前

    Getting Dates between a range of dates

    DECLARE @DateFrom smalldatetime, @DateTo smalldatetime;
    SET @DateFrom='20000101';
    SET @DateTo='20081231';
    -------------------------------
    WITH T(date)
    AS
    ( 
    SELECT @DateFrom 
    UNION ALL
    SELECT DateAdd(day,1,T.date) FROM T WHERE T.date < @DateTo
    )
    SELECT date FROM T OPTION (MAXRECURSION 32767);