如何获得一年中的财务日,即如果我将4月2日通过该功能,则应返回2.财政年度从每年的4月1日开始。
答案 0 :(得分:2)
财务日历是特定于组织的,虽然很少见,但可以更改。最简单的解决方案是创建一个概述财政日历的表格。因此,您可以使用CTE模仿它,但最好将其存储为表格。
With FiscalCalendarStarts As
(
Select 1 As FiscalPeriod
, Cast('20120401' As DateTime) As StartDate
Union All
Select FiscalPeriod + 1
, Case
When Month(StartDate) = 12 Then DateAdd(m, Month(StartDate) - 12 + 1, StartDate)
Else DateAdd(m, 1, StartDate)
End
From FiscalCalendarStarts
Where FiscalPeriod < 12
)
, FiscalCalendar As
(
Select FiscalPeriod
, StartDate
, DateAdd(d, -1, DateAdd(m, 1, StartDate)) As EndDate
From FiscalCalendarStarts
)
Select *
From FiscalCalendar
Where @SomeDate Between StartDate And EndDate
修改强>
要获得日期计数(我承认我在上述解决方案中没有提供),诀窍是根据输入日期确定实际的会计年度开始日期。为此,您可以执行以下操作,根据您的要求,我已将其添加到函数中
Create Function dbo.FiscalDay ( @Input datetime )
Returns int
As
Begin
Declare @StartDayMonth char(4);
Set @StartDayMonth = '0401';
Return (
Select DateDiff(d, FYStartDate, @Input) + 1
From (
Select DateAdd(yyyy
, Case
When DatePart(dy, @Input) >= DatePart(dy, StartDate) Then 0
Else -1
End
, StartDate) As FYStartDate
From (
Select Cast( Cast(Year(@Input) As char(4))
+ @StartDayMonth As datetime ) As StartDate
) As S1
) As S
)
End
我从0401
的存根开始,它表示会计年度开始的月份和日期。为此,我在前面的日期前面加上20120401
,如果2012年的日期过去了。如果@Input
晚于1月4日,那么我们将在@Input
年的新会计年度中。如果@Input
早于1月4日,那么我们将在上一年1月1日开始的会计年度中进行。现在我们有了财政开始日期,我们可以简单地找到它们之间的天数并加1(否则1-Apr将被视为第0天而不是第1天)。请注意,自2012年以来,通过2012年3月31日将返回366而不是365,这是闰年。
答案 1 :(得分:1)
请尝试此功能。这将返回会计年度的日期编号。
CREATE FUNCTION [dbo].[FiscalDay] (@CurrentDATE datetime)
RETURNS int
AS
BEGIN
DECLARE @FiscalDay int;
DECLARE @YearStartDate DateTime;
Set @YearStartDate=Cast('20120401' As DateTime)
set @FiscalDay = DATEDIFF(DAY,@YearStartDate , @CurrentDATE)
RETURN(@FiscalDay);
END;
GO