【问题标题】:SQL Server for last 12 months with begin_date and end_dateSQL Server 过去 12 个月的 begin_date 和 end_date
【发布时间】:2020-05-26 13:07:45
【问题描述】:

我无法显示每条记录的过去 12 个月,有人可以帮忙吗? 现在我只能为每条记录显示一个月。

DECLARE @DateEnd as DATETIME = DATEADD(month,((YEAR(getdate())-1900)*12) + MONTH(getdate())-1,-1)
--             SET @DateEnd =  '20191130'

DECLARE @Frequency_List table (FREQUENCY_ID char(3)); INSERT into @Frequency_List values ('118')    --                ('111'),('118'),('110')        --             'MTD','QTD','YTD'

DECLARE @Entity_List table (ENTITY_NAME char(50)); INSERT into @Entity_List values 
('F1000'),('R2202'),('R528'),('R810'),('R567'),('R402I'),('R508'),('F1000'),('A950A'),('R557'),('R559'),('R560'),('TBNOBL'),('ALTACORP'),('R590RVME'),('Z490'),('R5070'),('R591'),('R710')

select    P.PORTF_CODE, F.EXT_NAME, REPLACE(CONVERT(VARCHAR(10), AKRE.BEGIN_DATE, 102), '.', '-') as 'BEGIN_DATE', REPLACE(CONVERT(VARCHAR(10), AKRE.END_DATE, 102), '.', '-') as 'END_DATE', 
                                ISNULL(AKRE.PTF_END_OAD,0) 'PTF End Duration', ISNULL(AKRE.BMK_END_OAD,0) 'BMK End Duration', (ISNULL(AKRE.PTF_END_OAD,0)-ISNULL(AKRE.BMK_END_OAD,0)) 'Diff End Duration',
                                ISNULL(AKRE.PTF_END_OAS,0)*10000 'PTF End Spread', ISNULL(AKRE.BMK_END_OAS,0)*10000 'BMK End Spread', (ISNULL(AKRE.PTF_END_OAS,0)-ISNULL(AKRE.BMK_END_OAS,0))*10000 'Diff End Spread',
                                ((ISNULL(AKRE.PTF_END_OAD,0)*(ISNULL(AKRE.PTF_END_OAS,0)*10000))-(ISNULL(AKRE.BMK_END_OAD,0)*(ISNULL(AKRE.BMK_END_OAS,0)*10000))) 'DIF_END_DTS'

from BISAMDW..ATTX_KEY_RATES_EFFECTS AKRE 
left join BISAMDW..PORTFOLIO P on P.PORTF_ID = AKRE.PORTF_ID
left join BISAMDW..ATTR_INSTRUMENT AI on AI.ATINS_ID = AKRE.ATINS_ID
left join [BISAMDW].[dbo].[UD_GROUP] GRP on AKRE.USER_DEFINED_GROUP_ID=GRP.USER_DEFINED_GROUP_ID
left join BISAMDW..T_FREQUENCY F on F.FREQUENCY_ID = AKRE.FREQUENCY_ID

where AKRE.END_DATE = @DateEnd and P.PORTF_NAME in ( select ENTITY_NAME from @Entity_List) 
                and AKRE.PORTF_CONFIG_ID in ( 1 )
                and AKRE.FREQUENCY_ID in (select FREQUENCY_ID from @Frequency_List)
                and AKRE.PTF_RETURN is NOT null
                and GRP.EXT_CODE in ('BARCLAYS','MASTER_2016')         

order by 1,2

sample result中开始月份和结束月份列的结果应该是这样的:

MonthStartDate  MonthEndDate
2011-04-01  2011-04-30
2011-05-01  2011-05-31
2011-06-01  2011-06-30
2011-07-01  2011-07-31
2011-08-01  2011-08-31
2011-09-01  2011-09-30
2011-10-01  2011-10-31
2011-11-01  2011-11-30
2011-12-01  2011-12-31
....

谢谢!

【问题讨论】:

  • My SQL 还是 SQL Server?它们是 2 个非常不同的 RDBMS。从你的语法来看,这看起来像 T-SQL,它暗示了 SQL Server。
  • 您好 Kenny smith,欢迎来到 Stack Overflow。我看不出您的查询与预期结果有何关联。您是否只是想建立一个过去 12 个月的开始和结束月份的列表(如您的示例数据所示)?如果是这样,您应该删除该查询。否则,您应该显示正确的样本数据和预期结果。
  • @Larnu:给定语法,这必须是 SQL Server。我删除了 MySQL 标签。
  • 如果 OP 只是在每个月的开始和结束日期之后,似乎他们应该投资日历表。

标签: sql sql-server tsql date


【解决方案1】:

如果您想要生成过去 12 个月(加上当前月份)的开始和结束月份列表,那么一种选择是使用递归查询:

with cte as (
    select 
        dateadd(
            year, 
            -1, 
            datefromparts(year(getdate()), month(getdate()), 1)
        ) monthStartDate
    union all
    select dateadd(month, 1, monthStartDate)
    where monthStartDate < dateadd(month, -1, getdate())
)
select monthStartDate, eomonth(monthStartDate) monthEndDate from cte

如果您要多次使用此数据,则应将此查询的结果存储在单独的表中,然后您可以直接在查询中使用该表。这称为日历表

【讨论】:

    【解决方案2】:

    如果您只需要每个月的开始日期和结束日期,我个人建议创建一个Calendar Table(有 100 个有关如何创建这些示例的示例)。然后从该表中获取开始和结束日期是微不足道的:

    SELECT MIN(C.CalendarDate) AS MonthStart,
           MAX(C.CalendarDate) AS MonthEnd
    FROM dbo.Calendar C
    WHERE C.CalendarDate >= '20110101'
      AND C.CalendarDate < '20200601'
    GROUP BY C.CalendarYear,
             C.CalendarMonth;
    

    或者,您可以使用 Tally 动态生成这些:

    DECLARE @StartDate date = '20110101',
            @EndDate date = '20200601';
    
    WITH N AS(
        SELECT N
        FROM (VALUES(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL))N(N)),
    Tally AS(
        SELECT TOP (SELECT DATEDIFF(MONTH, @StartDate, @EndDate)) ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) -1 AS I
        FROM N N1, N N2, N N3, N N4, N N5)
    SELECT DATEADD(MONTH, T.I, @StartDate) AS MonthStart,
           EOMONTH(DATEADD(MONTH, T.I, @StartDate)) AS MonthEnd
    FROM Tally T;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多