2017-10-17 74 views
0

我期待计算一个员工如果在年中开始直到本财年结束时(4月1日 - 3月31日)工作了多少个星期)。动态计算到该日期的会计年度和周末结束

例如,一名员工在01/10/2017(英国日期)开始在该公司工作我需要计算他们将工作到31/03/2018(含)的周数。

员工开始日期的字段为表'Employee'的'START_DATE'。我还有一个日历表,包含您可以想象的每种日期格式,并且还包含会计年度。

我发现这个问题,但它并没有完全解决我的问题:Calculate totals of field based on current fiscal year only - SQL

任何帮助非常赞赏。

回答

1

这取决于你如何分类一周。它是否需要整整一周?从非星期一的一天开始是否意味着如果他们在不是星期五的一天结束,那么它不会算作整整一周? 这是您必须识别您的业务逻辑的地方。

这里有一些基本的DATEDIFF操作,您可以使用两个日期,你可以以此为基础使用您的计算之间计算出的差异:

DECLARE @startDate DATE = '2017-10-01' 
DECLARE @endDate DATE = '2018-03-31' 

SELECT @startDate StartDate, @endDate EndDate, 
     DATEDIFF(DAY, @startDate, @endDate) DaysPassed, 
     DATEDIFF(WEEK, @startDate, @endDate) WeeksWorked, 
     DATEDIFF(DAY, @startDate, @endDate)/7.0 CalculatedWeeksWorked 

产地:

StartDate EndDate DaysPassed WeeksWorked CalculatedWeeksWorked 
---------- ---------- ----------- ----------- --------------------- 
2017-10-01 2018-03-31 181   25   25.857142 

此外,您可能需要考虑除周末外的工作天数,以计算完整工作周数,如果是这样,请查看此文章:

get DATEDIFF excluding weekends using sql server

财年

摸出财年,你应该能够简单地看日期,像这样的月份值:

DECLARE @startDate DATE = '2017-10-01'; 

-- if the month is greater than 3, add a year, else take the current year 
SELECT CASE 
      WHEN DATEPART(MONTH, @startDate) > 3 THEN 
       CAST(DATEPART(YEAR, @startDate) + 1 AS VARCHAR(10)) + '-03-31' 
      ELSE 
       CAST(DATEPART(YEAR, @startDate) AS VARCHAR(10)) + '-03-31' 
     END AS fiscalYearEnd; 

编辑@startDate并测试以上,它应该有望在大多数情况下工作。我给了它一个快速测试,它似乎返回预期的结果。

+0

感谢您的回复。虽然这会起作用,但问题在于没有“结束日期”,“结束日期”是本财年的最后一天,这正是我在解决问题时所遇到的问题(如我正在撰写的报告将来会持续多年)。所以我需要弄清楚的是如何根据“开始日期”来计算会计年度结束日期。 –

+0

@ADicks看到我的更新。 – Tanner

+0

太棒了!我已经很快测试过了,它似乎表现出色。谢谢。 –

0

DATEDIFF function

ROUND(DATEDIFF(CURRENT_TIMESTAMP, START_DATE)/7, 0) AS weeks 

其中0是十进制数。

WEEKS的问题在于它不会为1月1日的日期返回正确的结果。

+0

不幸的是,这不考虑财政年度。财年(4月1日至3月31日)为假期。 –