sql - sql server 中两个日期之间的年份以及每个日期在 sql server 中的开始和结束日期
问题描述
我想得到两个日期之间的年份及其开始日期和结束日期。假设如果我输入 startdate 为“07/06/2017”,enddate 输入为“18/09/2019”,我想列出它们的开始和结束日期之间的年份分别结束日期。请建议我如何实现。
输入表:
BusinessRefId Period GoalType Amount StartDateUtc EndDateUtc Currency
Business B Year CommittedTransactionFee 18000 07/06/17 00:00 USD
输出表:
BusinessRefId Period GoalType Amount StartDateUtc EndDateUtc Currency
Business B 2019-2020 CommittedTransactionFee 18000 07/06/2019 07/06/2020 USD
Business B 2018-2019 CommittedTransactionFee 18000 07/06/2018 07/06/2019 USD
Business B 2017-2018 CommittedTransactionFee 18000 07/06/2017 07/06/2018 USD
我需要将日期拆分为月份,即如果 BusinessGoal.Period = 'Month' 并且我需要一个查询,该查询根据 BusinessGoal 表中提到的 Period 拆分日期,并在“Year”和“Year”的输入和输出表中给出“月”分别。输入表(BusinessGoal):
BusinessRefId Period GoalType Amount StartDateUtc EndDateUtc Currency
Business C Year CommittedTransactionFee 18000 05/07/19 00:00:00 19/09/19 00:00:00 USD
输出表(BusinessGoal):
BusinessRefId Period GoalType Amount StartDateUtc EndDateUtc Currency
Business C 2019-07 - 2019-08 CommittedTransactionFee 18000 05/07/2019 00:00:00 05/08/2019 00:00:00 USD
Business C 2019-08 - 2019-09 CommittedTransactionFee 18000 05/08/2019 00:00:00 05/09/2019 00:00:00 USD
Business C 2019-09 - 2019-10 CommittedTransactionFee 18000 05/09/2019 00:00:00 05/10/2019 00:00:00 USD
解决方案
你需要一个数字表,这里我用最简单的一个
select BusinessRefId
, cast(ys.y as varchar(4)) + '-' + cast(ys.y + 1 as varchar(4)) Period
, GoalType, Amount
, dateadd(year, nmbs.n, tbl.StartDateUtc) StartDateUtc
, dateadd(year, nmbs.n + 1,tbl.StartDateUtc) EndDateUtc
, Currency
from
-- your real table here
(values (1, 'year', 'CommittedTransactionFee', 1800, cast('20160607' as date), cast (null as date), 'USD'))
tbl(BusinessRefId, Period, GoalType, Amount, StartDateUtc, EndDateUtc, Currency)
join
-- table of numbers
(values (0),(1),(2) --,..
) nmbs(n)
on dateadd(year, nmbs.n + 1, tbl.StartDateUtc) <= getdate()
cross apply (select Year(tbl.StartDateUtc) + nmbs.n y ) ys
编辑
请参阅小提琴
这是我的查询版本,其中包含更多关于需要哪些行(注意ON
子句中的差异)以及如何计算结束日期的条件。它使用了 Soundappan 的 ddl 和数据(扩展),据称它们与真实的 ddl 和数据非常接近。主要思想是相同的,使用数字表。您可能希望在数据库中实例化表以在其他类似查询中使用它。
推荐阅读
- symfony - Symfony 4 - 更改公用文件夹路径(未指定输入文件。错误)
- mongodb - 不同版本和环境中的mongodb查询速度慢
- matplotlib - 关于在 anaconda 环境中使用 pip 的安装错误信息
- android - 无法在已部署的反应本机应用程序上使用 IP 地址进行本地网络调用
- spring - 在聊天应用程序上建立相同服务的 Pod 间通信
- sharepoint-online - 使用 pnp.js 作为 CDN 在线项目
- excel - 仅复制 WorkSheet VBA 代码而不是数据
- python - str 的 .index 方法如何在 python 中工作?
- sql - 使用 SQL 查询从表中提取数据
- python - *= 数组和整数之间的乘数问题