2012-05-03 10 views
0

年の財務日を取得する方法、つまり関数に4月2日を渡す場合は、2を返します。会計年度は、毎年4月1日から開始します。年の金融日の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が1-Aprよりも遅い場合は、@Inputの新しい会計年度になります。 @Inputが1 - 4月より前の場合、私たちは今年度の1 - 4月に始まる会計年度です。今度は財政開始日があるので、それらの間の日数を見つけて1を加えてください(そうでなければ、1月は1日ではなく0日と見なされます)。 2012年3月31日を過ぎると、2012年がうるう年なので365の代わりに366が返されることに注意してください。

+0

あなたはそのテーブルなしでコードを与えることができますか?私は、来年の4月1日から3月31日に始まる日数が必要ですか? – Olivarsham

+0

@Olivarsham - 会計日を提供するために私の応答を更新しました。 – Thomas

+0

ありがとう..それは働いた:) – Olivarsham

1

@Olivarsham、会計年度はすべての国共通ではありません。いくつかの場所はApr-mar、どこかはJan-Decです。だから、それはあなたの自己のために書く必要があるあなたの特別なアプリケーションの要件です。私はそれについての標準的な質問はないと思います。

この機能をうまく試してください。これにより、会計年度の日番号が返されます。

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親切に与えられた関数を試してください –

関連する問題