Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server:列出范围之间的月份_Sql_Sql Server - Fatal编程技术网

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

SQL Server:列出范围之间的月份,sql,sql-server,Sql,Sql Server,我试图计算金融对冲的价值,但我希望输入尽可能简单。因此,例如,我有一份合同,从2017年2月1日到2018年12月31日,每月的合同数量为1000。它不一定是这个日期范围,可以是1个月或3年以上,执行价格为3美元。我只想在4列中输入1行数据:[Volume]、[Start]、[End]、[Strike] 问题是我需要将2017年的数据乘以一个价格,2018年的数据乘以另一个价格。简单的答案是在2017年和2018年分别输入一行,但我不想这样做,因为我可能有50份或更多的合同要输入,我希望尽可能少

我试图计算金融对冲的价值,但我希望输入尽可能简单。因此,例如,我有一份合同,从2017年2月1日到2018年12月31日,每月的合同数量为1000。它不一定是这个日期范围,可以是1个月或3年以上,执行价格为3美元。我只想在4列中输入1行数据:[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

日历表在这种情况下很有用,有很多示例脚本,下面是一个:

您也可以简单地在价格表中使用年和月,并在范围上进行联接,可以使用整型年\月\整数字段'201601、201602、201603`

然后:


如果在contracts表中包含开始和结束的整数版本year month,则可以简化联接条件。

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

设置:

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

请注意,对于一个注册表,此技术只计算月份数。要从合同中获取数据,您必须将其与数据集表连接起来。

您只需要在日期范围内逐年计算月数?合同总是在月初/月底开始/结束,还是可以在月中开始/结束?@JorgeCampos是的,我相信这就是我想要的。@HartCO它们都应该是完整的月份,从每月的第一天开始到最后一天结束。谢谢!我将在周一试一试。
qtyMonths   yr
  11       2017
  12       2018