簡體   English   中英

年度財務日的SQL函數

[英]SQL Function for Financial Day of the year

如何獲取一年中的財務日,即如果我在4月2日通過該函數,則應返回2。財務年度始於每年的4月1日。

財務日歷是特定於組織的,盡管很少,但可以更改。 最簡單的解決方案是創建一個概述財政日歷的表。 因此,您可以使用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年的日期,我會得到類似20120401 如果@Input遲於1月4日,則我們處於@Input年份的新會計年度。 如果@Input早於1月4日,則我們處於從上一年的1月4日開始的會計年度。 現在我們有了財政開始日期,我們可以簡單地找到它們之間的天數並加1(否則,將4月1日視為第0天,而不是第1天)。 請注意,由於2012年是a年,因此通過2012年3月31日返回366,而不是365。

@Olivarsham,並非每個國家都有共同的財政年度。 有些是四月至三月,有些是一月至十二月。 因此,這是您的特殊應用程序要求,然后您需要自己編寫。 我認為沒有標准的查詢。

請嘗試此功能。 這將返回您會計年度的天數。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM