首页 > 解决方案 > 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

标签: sqlsql-server

解决方案


你需要一个数字表,这里我用最简单的一个

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 和数据非常接近。主要思想是相同的,使用数字表。您可能希望在数据库中实例化表以在其他类似查询中使用它。


推荐阅读