2012-10-10 87 views
2

每年我都來更新我公司的財務報告,包括在新的財政年度(如當年未與歷年共界),所以我做.....SQL Server - 如何動態確定財政年度?

Case 
    when ST_date >= '1996.11.01 00:00:00' and st_date < '1997.11.01 00:00:00' 
    then '96-97' 
[etc] 
end as year, 

每年我必須記住我需要修改哪些報告 - 大多數年我都會忘記!

...有沒有一種簡單的動態方法來確定這一點?

回答

2

有一個看看這個例子:

declare @ST_Date datetime = '20120506' 

SELECT 
    convert(char(2),DateAdd(m,-10,@ST_DATE),2)+'-'+ 
    convert(char(2),DateAdd(m,+ 2,@ST_DATE),2) as year 

作爲一個列表達式:

convert(char(2),DateAdd(m,-10,ST_DATE),2)+'-'+ 
    convert(char(2),DateAdd(m,+ 2,ST_DATE),2) as year 

非常容易的!

我處理這些問題(財政年度,薪酬期限等)的方式是要認識到財政年度與任何一年相同的事實,除非他們在X個月後開始。因此,簡單的解決方案是將FY年移回到歷年,從中進行任何「年度」比較或派生「年」(或「月」)。

6

你絕對可以在SQL Server中編寫一個簡單的存儲功能根據日期來確定財政年度:

CREATE FUNCTION dbo.GetFinancialYear (@input DATETIME) 
RETURNS VARCHAR(20) 
AS BEGIN 
    DECLARE @FinYear VARCHAR(20) 

    SET @FinYear = 
     CASE 
      WHEN @INPUT >= '19961101' AND @input < '19971101' THEN '96-97' 
      WHEN @INPUT >= '19971101' AND @input < '19981101' THEN '97-98' 
      ELSE '(other)' 
     END 

    RETURN @FinYear 
END 

,然後只用在您所有的疑問。

SELECT 
    somedate, dbo.GetFinancialYear(somedate) 
...... 

如果您需要添加一個新的財政年度 - 只需更新一個功能,就完成了!

更新:,如果你想使這個完全動態,你可以在該財政年度總是開始於11月1日的事實,依靠 - 再使用這種方式來代替:

CREATE FUNCTION dbo.GetFinancialYear (@input DATETIME) 
RETURNS VARCHAR(20) 
AS BEGIN 
    DECLARE @FinYear VARCHAR(20) 

    DECLARE @YearOfDate INT 

    IF (MONTH(@input) >= 11) 
     SET @YearOfDate = YEAR(@input) 
    ELSE 
     SET @YearOfDate = YEAR(@input) - 1 

    SET @FinYear = RIGHT(CAST(@YearOfDate AS CHAR(4)), 2) + '-' + RIGHT(CAST((@YearOfDate + 1) AS CHAR(4)), 2) 

    RETURN @FinYear 
END 

這將返回:

  • 05/06的日期,如2005-11-25
  • 04/05的日期,如2005-07-25
+0

好極了!我會爲此付出 - 謝謝! – dazzathedrummer

+1

@dazzathedrummer如果您發現此答案解決了您的問題,請您將其標記爲已接受? – chridam

0
Declare @FinancialMonth Varchar(100)=NULL,@Month smallint,@Date DateTime='04/06/2013' 

BEGIN TRY 
SELECT @FinancialMonth='01-'+IsNULL(@FinancialMonth,'April')+'-'+Cast(year(getdate()) as varchar) 
SELECT @Month=(Month(Cast(@FinancialMonth as datetime))-1) * -1 
END TRY 
BEGIN CATCH 
SELECT 
     ERROR_NUMBER() AS ErrorNumber,'Invalid Financial Month' ErrorMessage 
END CATCH 

SELECT Month((CONVERT([varchar](10),dateadd(month,(@Month),@Date),(101)))) FinancialMonth, 
Year((CONVERT([varchar](10),dateadd(month,(@Month),@Date),(101)))) FinancialYear 
,DatePart(qq,(CONVERT([varchar](10),dateadd(month,(@Month),@Date),(101)))) FinancialQuarter 
-1

這適用於我的財務年度在七月開始。

CASE WHEN DatePart(mm, [YourDate]) >= 7 
    THEN convert(varchar(10), YEAR([YourDate])) +'/'+ Convert(varchar(10), YEAR([YourDate]) + 1) 
    ELSE Convert(varchar(10), YEAR([YourDate]) - 1) +'/'+ Convert(varchar(10), YEAR([YourDate])) 
    END AS [Financial Year], 
0

這個爲我工作,並將其設置爲實際FY年底日期。

SET @enddatefy = convert(DATE, str(datepart(yyyy,DateAdd(m,-6,@enddate))+1)+'0630',112) SET @enddatefyid = str(datepart(yyyy,DateAdd(m,-6,@enddate))+1)+'0630'

0
datename(YEAR, DATEADD(M,-3,Date)) +'-'+ cast((datepart(YEAR, DATEADD(M,-3,Date)) + 1) %100 as varchar(2)) 

計算在列 '日期'

財政年度範圍從四月一日至三月31日

0
Create FUNCTION dbo.GetFinancialYear (@input DATETIME) 
RETURNS VARCHAR(20) 
AS BEGIN 
    DECLARE @FinYear VARCHAR(20) 

    IF (MONTH(@input) > 3) 
     SET @FinYear = RIGHT(CAST(Year(@input) AS CHAR(4)), 4) + '-' + RIGHT(CAST((Year(@input) + 1) AS CHAR(4)), 2) 
    ELSE 
     SET @FinYear = RIGHT(CAST((Year(@input) - 1) AS CHAR(4)), 4) + '-' + RIGHT(CAST(Year(@input) AS CHAR(4)), 2) 

    RETURN @FinYear 
END 
0
Declare @date1 datetime = '2017-07-01' 
Select Case 
    When Month(@date1)>=7 Then 'FY'+Convert(NVARCHAR(10),(Right(year(getdate()),2)+1)) 
    Else 'FY'+Convert(NVARCHAR(10),(Right(year(getdate()),2))) 
End 
相關問題