2012-05-03 55 views
0

如何獲得一年中的財務日,即如果我將四月份的二號傳遞給該函數,則應該返回2.每年的四月一號開始財政年度。年度財務日的SQL函數

+0

是否包括週末(美國,中東?),交換假期或銀行假期? – joshp

+1

這可能與您的申請無關,但請不要忘記,這也取決於您所在的國家。例如,澳大利亞的財政年度實際上是從7月1日到6月30日,因此4月2日不應該返回2 http://en.wikipedia.org/wiki/Fiscal_year有關於不同會計期間的更多信息。 –

+0

應該從明年4月1日到3月31日。就這樣。無需排除節假日。 – Olivarsham

回答

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存根代表的財年開始的月份和日期年。爲此,我預先通過日期的一年,所以如果通過了2012年的日期,我會得到類似20120401的內容。如果@Input晚於4月1日,那麼我們處於@Input年的新財年。如果@Input早於1月4日,那麼我們處於上一年1月1日開始的財政年度。現在我們有財政開始日期,我們可以簡單地找到它們之間的天數並加1(否則1月4日將被視爲第0天而不是第1天)。請注意,自2012年3月31日起,閏年將自2012年起恢復366次而不是365次。

+0

謝謝。你可以給沒有表的代碼?我需要從4月1日開始到明年3月31日的daycount? – Olivarsham

+0

@Olivarsham - 我更新了我提供財政日的答覆。 – Thomas

+0

謝謝..那工作:) – Olivarsham

1

@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 
+0

是的,我只是要求自定義查詢.. – Olivarsham

+0

@Olivarsham請嘗試給定的功能 –