首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SQL Server :列出范围之间的月份

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

Stack Overflow用户
提问于 2017-01-29 04:41:32
回答 2查看 47关注 0票数 0

我正在尝试计算金融套期保值的价值,但我希望输入尽可能简单。例如,我有一份合同,每月数量为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。我可以很容易地将其修改为每月,而不是每年,如果它有助于简化事情。

我需要最终的计算是这样的:

代码语言:javascript
运行
复制
2017: 11,000 * (3 - 4.50) = -$16,500
2018: 12,000 * (3 - 5.25) = -$27,000
Total value = -$43,500

所以我的问题是,我如何才能得到这个范围内每一年的月数?

我希望输出是这样的

代码语言:javascript
运行
复制
2017, 11
2018, 12
EN

回答 2

Stack Overflow用户

发布于 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...‘

然后:

代码语言:javascript
运行
复制
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标准。

票数 1
EN

Stack Overflow用户

发布于 2017-01-29 05:21:39

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

设置:

代码语言:javascript
运行
复制
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');

查询:

代码语言:javascript
运行
复制
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;

结果:

代码语言:javascript
运行
复制
qtyMonths   yr
  11       2017
  12       2018

请注意,此技术仅在一个注册表的情况下计算月份。要从您的合同中获取数据,您必须将其与数据集表连接。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41914617

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档