SQL查询以获取两个日期之间的月份列表

SQL查询以获取两个日期之间的月份列表,sql,sql-server,Sql,Sql Server,我需要两个日期之间的日期自定义输出。让我解释一下我到底需要什么 假设我有两个日期'2016-01-01'和'2016-12-31'yyyy-mm-dd现在我想显示这两个日期之间的月份/日期列表,但顺序是3个月,6,9,12,18,24等 例如 例如,如果我将开始和结束日期输入为'2016-01-01'和'2016-12-31',则输出应显示到12个月,因为开始和结束之间的差值为12 所以输出应该是 3 Months 1/1/2016 4/1/2016 6 Months 1/1/

我需要两个日期之间的日期自定义输出。让我解释一下我到底需要什么

假设我有两个日期
'2016-01-01'
'2016-12-31'
yyyy-mm-dd
现在我想显示这两个日期之间的月份/日期列表,但顺序是3个月,6,9,12,18,24等

例如

例如,如果我将开始和结束日期输入为
'2016-01-01'
'2016-12-31'
,则输出应显示到12个月,因为开始和结束之间的差值为12

所以输出应该是

3 Months    1/1/2016    4/1/2016
6 Months    1/1/2016    7/1/2016
9 Months    1/1/2016    10/1/2016
12 Months   1/1/2016    1/1/2017
如果开始和结束日期分别为
'2016-01-01'
'2016-02-15'
,则输出应显示3个月,因为结束日期在3个月之内

所以输出应该是

3 Months    1/1/2016    4/1/2016
sql如下所示

声明@startdate日期='2016-01-01',@endDate日期='2016-12-31'

declare @mindate date, @maxdate date
    SET @mindate = @startdate;
    SET @maxdate = @endDate



        INSERT INTO @ReportMonths(ReportMonth,MinMOnth,MaxMonth) values
    ( '3 Months',@mindate,dateadd(month,3,@mindate)),
    ( '6 Months',@mindate,dateadd(month,6,@mindate)),
    ( '9 Months',@mindate,dateadd(month,9,@mindate)),
    ( '12 Months',@mindate,dateadd(month,12,@mindate)),
    ( '18 Months',@mindate,dateadd(month,18,@mindate)),
    ( '24 Months',@mindate,dateadd(month,24,@mindate)),
    ( '36 Months',@mindate,dateadd(month,36,@mindate)),
    ( '48 Months',@mindate,dateadd(month,48,@mindate)),
    ( '60 Months',@mindate,dateadd(month,60,@mindate)),
    ( '72 Months',@mindate,dateadd(month,72,@mindate))
问题是,当Maxdate列中没有“结束日期”时,如何删除其余行

Try This
 Select * FROM TABLE_NAME WHERE dates BETWEEN '2016-01-01' and '2016-12-31'
     or
 Select * FROM TABLE_NAME WHERE dates BETWEEN '20160101' and '20161231'
declare @mindate date, @maxdate date
    SET @mindate = {d'2016-01-01'};
    SET @maxdate = {d'2016-02-15'};

DECLARE @ReportMonths TABLE(ReportMonth VARCHAR(100),MinMOnth DATE,MaxMonth DATE)
INSERT INTO @ReportMonths VALUES
    ( '3 Months',@mindate,dateadd(month,3,@mindate)),
    ( '6 Months',@mindate,dateadd(month,6,@mindate)),
    ( '9 Months',@mindate,dateadd(month,9,@mindate)),
    ( '12 Months',@mindate,dateadd(month,12,@mindate)),
    ( '18 Months',@mindate,dateadd(month,18,@mindate)),
    ( '24 Months',@mindate,dateadd(month,24,@mindate)),
    ( '36 Months',@mindate,dateadd(month,36,@mindate)),
    ( '48 Months',@mindate,dateadd(month,48,@mindate)),
    ( '60 Months',@mindate,dateadd(month,60,@mindate)),
    ( '72 Months',@mindate,dateadd(month,72,@mindate));
--查询将返回
@ReportMonths
的所有行,并包括后面的MaxMonth。这是较大的中最小的

SELECT rm.*
FROM @ReportMonths AS rm
WHERE rm.MaxMonth<=(
                        SELECT MIN( MaxMonth)
                        FROM @ReportMonths 
                        WHERE MaxMonth > @maxdate
                    );
选择rm*
从@ReportMonths起作为rm
其中rm.MaxMonth@maxdate
);

如果我正确理解了问题,您可以执行以下操作。我发现日期之间的月差。然后我在where子句中使用它

SELECT *
FROM
    @ReportMonths
WHERE
    LEFT(ReportMonth, LEN(ReportMonth) - 7) * 1 <= ((DATEDIFF(MONTH, @mindate, @maxdate) / 3) + 1) * 3

12岁之后跳过6岁,24岁之后跳过12岁。为什么?因为这就是我需要的
DECLARE @mindate DATE = '2016.01.01' -- yyyy.mm.dd
DECLARE @maxdate DATE = '2016.12.31' -- yyyy.mm.dd

ReportMonth     MinMOnth   MaxMonth
--------------- ---------- ----------
3 Months        2016-01-01 2016-04-01
6 Months        2016-01-01 2016-07-01
9 Months        2016-01-01 2016-10-01
12 Months       2016-01-01 2017-01-01