【问题标题】:SQL Loop Through Years but by Fiscal Year, Not Calendar YearSQL 循环遍历年份,但按会计年度,而不是日历年
【发布时间】:2018-08-24 11:38:27
【问题描述】:

我正在构建一个 SQL 函数,它可以根据一个人的开始和结束日期计算他们工作的总小时数。

例如:

开始日期 -------- 结束日期 --------- 小时
2015 年 3 月 1 日 ----- 2015 年 3 月 31 日 --------- 100
2015 年 4 月 1 日 ----- 2015 年 4 月 30 日 --------- 100
2015 年 5 月 1 日 --------- 2015 年 5 月 31 日 --------- 130
...

问题是我无法通过日历开始和结束日期来执行此操作。 (即 1 月至 12 月)它需要在财政开始和结束日期之前。

这需要从该人的开始日期(2015 年 3 月 1 日)到该日期之后的 12 个月(2016 年 3 月 1 日)。

SELECT  year(StartDate), SUM(Hours)
from EmployeeHours 
WHERE EmployeeID = 12345
group by year(StartDate)
order by year(StartDate) desc

因此,此代码正确返回每年的总和,但它基于日历年。

有人对我如何实现这一点有任何建议吗?

谢谢!

【问题讨论】:

  • 你能发布一个你的数据表的例子吗?
  • 你的 dbms 是什么?
  • 我正在使用 Microsoft SQL Server Management Studio,如果有帮助的话。我真的没有任何数据表。都是测试数据。

标签: sql sql-server


【解决方案1】:

您必须创建一个会计年度,该会计年度可以是当前年份,也可以是年份 +1,具体取决于您所在的月份。

declare @EmployeeHours table (EmployeeId int not null, startdate date not null, enddate date not null, [hours] int not null)
insert into @EmployeeHours (EmployeeId, startdate, enddate, [hours]) values
  (12345, '2015-2-1', '2015-2-28', 100)
, (12345, '2015-3-1', '2015-3-31', 100)
, (12345, '2015-4-1', '2015-4-30', 100)
, (12345, '2015-5-1', '2015-5-31', 130)


SELECT datepart(year, startdate) + iif(DATEPART(MONTH, StartDate) > 2, 1,0) as [fiscalyear], SUM([Hours])
from @EmployeeHours 
WHERE EmployeeID = 12345
group by datepart(year, startdate) + iif(DATEPART(MONTH, StartDate) > 2, 1,0)
order by 1 desc

输出

2016   330
2015   100

【讨论】:

  • 我有一个问题。让我们为这个人添加以下日期:“2016-01-01”、“2016-01-31”、“2016-02-01”、“2016-02-28”、“2016-03-01”、“2016-03” -30”您的查询如何知道从“2015-02-01”到“2016-02-01”获取日期。所以基本上它如何知道获取该 12 个月范围内的所有时间?而不是获取“2015” -03-01"?
  • @AppDude27 - 您最初的问题表明财政年度从 3 月(第 3 个月)开始。您也可以将我的查询复制到您的 SSMS 中,您可以添加您想要的任何日期和时间并执行它。
【解决方案2】:

试试这个,

create table #temp(StartDate datetime, EndDate datetime, Hours int)
insert into #temp values
 ('3/1/2015','3/31/2015' , 100) 
 ,('4/1/2015','4/30/2015' , 100 )
 ,('5/1/2015','5/31/2015', 130 )


Declare @sDate dateTime='2015-03-01'
Declare @EDate dateTime='2016-03-01'

SELECT  year(StartDate), SUM(Hours)
from #temp
WHERE 
--EmployeeID = 12345
--and 
StartDate>=@sDate and EndDate<=@EDate
group by year(StartDate)
order by year(StartDate) desc


 drop table #temp

【讨论】:

  • 这对我也有用。我通过将 @sDate 更改为 MIN(StartDate) 并将 eDate 更改为 MAX(StartDate) 对您的查询进行了修改,以便我们获取完整的财政范围。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-26
  • 1970-01-01
  • 2022-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
相关资源
最近更新 更多