SQL Server:列出范围之间的月份

Posted

技术标签:

【中文标题】SQL Server:列出范围之间的月份【英文标题】:SQL Server : list months between range 【发布时间】:2017-01-28 20:41:32 【问题描述】:

我正在尝试计算金融对冲的价值,但我希望输入尽可能简单。例如,我有一份合同,从 2017 年 2 月 1 日到 2018 年 12 月 31 日,每个月的数量为 1,000 份(不一定是这个日期范围,可能是 1 个月或 3 年以上)执行价格为 3 美元。我只想将 1 行数据输入 4 列:[Volume]、[Start]、[End]、[Strike]。

问题是我需要将 2017 年的数据乘以一个价格,将 2018 年的数据乘以另一个价格。简单的答案是为 2017 年输入一行,为 2018 年输入一行,但我不想这样做,因为我可能有 50 份或更多合同要输入,而且我想尽可能少地输入。

我会使用价格表中的两列 [Year],[Price]。它看起来像 [2017],[4.50] 和 [2018],[5.25]。如果它有助于简化事情,我可以轻松地将其修改为每月而不是每年。

我需要按照以下方式进行最终计算:

2017: 11,000 * (3 - 4.50) = -$16,500
2018: 12,000 * (3 - 5.25) = -$27,000
Total value = -$43,500

所以我的问题是,我如何才能计算范围内每年的月数?

我希望输出类似于

2017, 11
2018, 12

【问题讨论】:

您只想在一个日期范围内逐年计算月数? 合同总是在月初/月底开始/结束,还是可以在月中旬? @JorgeCampos 是的,我相信这就是我想要的。 @HartCO 它们都应该是整月,从当月的第一天开始到最后一天结束。 【参考方案1】:

日历表在这种情况下很有用,有很多示例脚本,这里有一个:https://www.mssqltips.com/sqlservertip/4054/creating-a-date-dimension-or-calendar-table-in-sql-server/

您也可以在price 表中简单地使用年份和月份并加入范围,可以使用整数类型Year_Month_Int 字段'201601、201602、201603...`

然后:

SELECT *
FROM contracts c
JOIN prices p
  ON p.Year_Month_Int BETWEEN (YEAR(c.start)*100)+MONTH(c.start) AND (YEAR(c.end)*100)+MONTH(c.end)

如果您在contracts 表中包含startend 的整数版本年月,则可以简化JOIN 条件。

【讨论】:

谢谢!我会在星期一试一试。【参考方案2】:

关于如何计算一个范围内的月数的另一种变体是:

设置:

create table soTest(
  id integer not null auto_increment,
  start_date datetime,
  end_date datetime,
  primary key (id)
);

insert into soTest (start_date, end_date) values 
    ('2017-02-01 00:00:00','2018-12-31 00:00:00');

查询:

select distinct case when extract(year from start_date) = yr 
            then format(datediff(concat(yr,'-12-31'), start_date)/30,0)
            else format(datediff(end_date, concat(yr,'-01-01'))/30,0) end as qtyMonths,
       yr
  from (select s.*, extract(year from start_date) yr from soTest s
         union all
        select s.*, extract(year from end_date) yr from soTest s
       ) a;

结果:

qtyMonths   yr
  11       2017
  12       2018

请注意,这种技术只会在一个注册表的情况下计算月份。要从您的合同中获取数据,您必须将其与您的数据集表一起加入。

【讨论】:

以上是关于SQL Server:列出范围之间的月份的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 查找接近服务日期和月份的行

SQL Server 2005获取任何年份中任何月份的第一个和最后一个日期

在 Pandas 中列出月份和年份

获取两个日期之间的月份范围

如何从 SQL Server 中的日期获取月份编号(不是月份名称)?

求教oracle sql用select as按月份搜索并列出总量。