【问题标题】:list date period between two date列出两个日期之间的日期时间段
【发布时间】:2018-04-30 22:27:54
【问题描述】:

我想知道是否有办法使用 sql 输出列出日期开始日期按年结束 + 1 个间隔(有闰年),如下所示:

Date_start    2014-06-01 00:00:00       Date_End 2017-05-31 00:00:00

select '2014-06-01 00:00:00',dateadd(DAY, 365, '2014-06-01 00:00:00')

2014-06-01 00:00:00   2015-06-01 00:00:00
2015-06-01 00:00:00   2016-05-31 00:00:00
2016-05-31 00:00:00   2017-05-31 00:00:00

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    也试试这个

    DECLARE @StartDate  DATE='15 JAN 2011',
            @EndDate    DATE='31 DEC 2018'
    
    
    ;WITH CTE_DATE AS
    (
        SELECT  DATEADD(DD,1,DATEADD(DD,-DATEPART(DD,@StartDate),@StartDate)) [START_DATE],
                DATEADD(DD,-DATEPART(DD,DATEADD(MM,1,@StartDate)),DATEADD(MM,1,@StartDate)) END_DATE
        UNION ALL
        SELECT  DATEADD(DD,1,DATEADD(DD,-DATEPART(DD,DATEADD(MM,1,[START_DATE])),DATEADD(MM,1,[START_DATE]))) [START_DATE], 
                DATEADD(DD,-DATEPART(DD,DATEADD(MM,1,DATEADD(MM,1,[START_DATE]))),DATEADD(MM,1,DATEADD(MM,1,[START_DATE]))) END_DATE 
        FROM CTE_DATE   
        WHERE END_DATE<@EndDate
    )
    
    SELECT * FROM CTE_DATE
    

    【讨论】:

      【解决方案2】:

      试试看

      DECLARE
        @MinDate date='20140601',
        @MaxDate date='20170531'
      
      ;WITH yearCTE AS(
        SELECT @MinDate StartDate,DATEADD(YEAR,1,@MinDate) EndDate
      
        UNION ALL
      
        SELECT EndDate,IIF(DATEADD(YEAR,1,EndDate)<@MaxDate,DATEADD(YEAR,1,EndDate),@MaxDate)
        -- if your version of SQLServer don't support IIF then use CASE
        --SELECT EndDate,CASE WHEN DATEADD(YEAR,1,EndDate)<@MaxDate THEN DATEADD(YEAR,1,EndDate) ELSE @MaxDate END
        FROM yearCTE
        WHERE EndDate<@MaxDate
      )
      SELECT StartDate,EndDate
      --SELECT StartDate,DATEADD(DAY,-1,EndDate) EndDate
      FROM yearCTE
      OPTION(MAXRECURSION 0);
      

      DATEADD(DAY,365,...) 的变体

      DECLARE
        @MinDate date='20140601',
        @MaxDate date='20170531'
      
      ;WITH yearCTE AS(
        SELECT @MinDate StartDate,DATEADD(DAY,365,@MinDate) EndDate
      
        UNION ALL
      
        SELECT EndDate,IIF(DATEADD(DAY,365,EndDate)<@MaxDate,DATEADD(DAY,365,EndDate),@MaxDate)
        -- if your version of SQLServer don't support IIF then use CASE
        --SELECT EndDate,CASE WHEN DATEADD(DAY,365,EndDate)<@MaxDate THEN DATEADD(DAY,365,EndDate) ELSE @MaxDate END
        FROM yearCTE
        WHERE EndDate<@MaxDate
      )
      SELECT StartDate,EndDate
      --SELECT StartDate,DATEADD(DAY,-1,EndDate) EndDate
      FROM yearCTE
      OPTION(MAXRECURSION 0);
      

      【讨论】:

      • 第二个是闰年的答案:DATEADD(DAY,365,...)
      猜你喜欢
      • 2023-03-30
      • 2017-01-29
      • 2014-11-22
      • 1970-01-01
      • 2012-06-03
      • 1970-01-01
      • 2017-09-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多