【问题标题】:SQL query to get list of month between two datesSQL查询获取两个日期之间的月份列表
【发布时间】:2016-12-27 09:53:51
【问题描述】:

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

假设我有两个日期 '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 date = '2016-01-01',@endDate DATE = '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 列中没有结束日期时如何删除其余行

【问题讨论】:

  • 12 后跳过 6,24 后跳过 12。为什么?
  • 因为这是我需要的

标签: sql sql-server


【解决方案1】:

你可以试试这个

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
                    );

【讨论】:

    【解决方案2】:
    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'
    

    【讨论】:

      【解决方案3】:

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

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

      结果:

      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多