我正在尝试计算金融套期保值的价值,但我希望输入尽可能简单。例如,我有一份合同,每月数量为1,000份,从2017年2月1日到2018年12月31日(它不会总是这个日期范围,可以是1个月或3+年),执行价为3美元。我只想在4列中输入一行数据:数量、开始、结束、执行。
问题是,我需要将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发布于 2017-01-29 05:05:36
日程表在这样的情况下会很有帮助,有很多示例脚本,下面就是其中之一: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表中包含start和end的整数版本年-月,则可以简化JOIN标准。
发布于 2017-01-29 05:21:39
关于如何计算某个范围内的月数的另一种变体是:
设置:
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请注意,此技术仅在一个注册表的情况下计算月份。要从您的合同中获取数据,您必须将其与数据集表连接。
https://stackoverflow.com/questions/41914617
复制相似问题