一年中财务日的SQL函数

时间:2012-05-03 06:27:22

标签: sql-server-2008

如何获得一年中的财务日,即如果我将4月2日通过该功能,则应返回2.财政年度从每年的4月1日开始。

2 个答案:

答案 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)

@Olivarsham,这个财政年度对每个国家都不常见。有些是4月到3月,有些是1月到12月。因此,这是您的特殊应用要求,那么您需要为自己写作。我认为没有标准的查询。

请尝试此功能。这将返回会计年度的日期编号。

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