2016-06-01 24 views
3

如何創建視圖以動態獲取基於會計年度(財政年度)的數據。如何根據會計年度動態查看數據

讓我們看看im有樣品數據的樣品數據。

Declare @t table(StartDate date) 
    insert into @t values('04/01/2012'), 
    ('01/01/2012'), 
    ('09/15/2013'), 
    ('04/01/2014'), 
    ('01/01/2015'), 
    ('09/15/2015'), 
    ('04/01/2016'), 
    ('01/01/2017'), 
    ('09/15/2016') 

只是舉個例子,如果我已經跑今天的觀點我需要2016年三月到四月2017年如果我已經跑視圖五月2017年,我需要三月2017年獲得的數據可能高達2017年。 我可以在Sql服務器腳本或存儲過程中解決問題,但是如何在動態視圖或視圖中實現相同的結果。 建議我!

我的腳本

DECLARE @STARTDATE DATETIME, @ENDDATE DATETIME,@CURR_DATE DATETIME 
SET @CURR_DATE='2016-06-01' 
IF MONTH(@CURR_DATE) IN (1,2,3) 
BEGIN 
    SET @STARTDATE= CAST(CAST(YEAR(@CURR_DATE)-1 AS VARCHAR)+'/04/01' AS DATE) 
    SET @ENDDATE= CAST(CAST(YEAR(@CURR_DATE) AS VARCHAR)+'/03/31' AS DATE) 
END 
ELSE 
BEGIN 
    SET @STARTDATE= CAST(CAST(YEAR(@CURR_DATE) AS VARCHAR)+'/04/01' AS DATE) 
    SET @ENDDATE= CAST(CAST(YEAR(@CURR_DATE)+1 AS VARCHAR)+'/03/31' AS DATE) 
END 

select * from @t 
where StartDate between 
@STARTDATE AND @ENDDATE 
order by year (StartDate) 

它給了我希望本財年(2016- 2017年) 但我該如何使用這一點,並創建一個VIEW

+0

能否請您詳細說明什麼確切地確定您的查詢的開始/結束日期? –

回答

1

您可以使用cte的日期基於視圖中的當前日期(GETDATE()):

;WITH cte AS (
SELECT CASE WHEN MONTH(GETDATE()) IN (1,2,3) THEN CAST(CAST(YEAR(GETDATE())-1 AS VARCHAR)+'/04/01' AS DATE) ELSE CAST(CAST(YEAR(GETDATE()) AS VARCHAR)+'/04/01' AS DATE) END AS StartDate, 
     CASE WHEN MONTH(GETDATE()) IN (1,2,3) THEN CAST(CAST(YEAR(GETDATE()) AS VARCHAR)+'/03/31' AS DATE) ELSE CAST(CAST(YEAR(GETDATE())+1 AS VARCHAR)+'/03/31' AS DATE) END AS EndDate 
) 

SELECT t.* 
FROM YourTable t 
INNER JOIN cte c 
ON t.StartDate between c.StartDate AND c.EndDate 
ORDER BY year(t.StartDate) 
+0

這是很好..在哪裏我忘了CTE – mohan111

0

如果你已經制定了數據在腳本\存儲過程中的代碼中,您可以在Table-Valued User-Defined Functions中重新使用此類代碼。

這樣你就可以像查看視圖一樣查詢UDF。

+0

我只是想在視圖中使用此代碼而不是在UDF – mohan111

0

你可以嘗試這樣的事情:

select t.* 
from @t t 
cross join (
    select startdate = case 
         when MONTH(@CURR_DATE) IN (1,2,3) 
          then CAST(CAST(YEAR(@CURR_DATE)-1 AS VARCHAR)+'/04/01' AS DATE) 
         else CAST(CAST(YEAR(@CURR_DATE) AS VARCHAR)+'/04/01' AS DATE) 
         end) s 
cross join (
    select enddate = case 
         when MONTH(@CURR_DATE) IN (1,2,3) 
          then CAST(CAST(YEAR(@CURR_DATE) AS VARCHAR)+'/03/31' AS DATE) 
         else CAST(CAST(YEAR(@CURR_DATE)+1 AS VARCHAR)+'/03/31' AS DATE) 
        end) e 
where t.StartDate between s.startdate and e.enddate 
order by year (t.StartDate) 
3
select t.*,getdate() 
    from @t t 
    where year(startdate) * 100 + month(startdate) >= 
     case 
     when month(getdate()) in (1,2,3) then (year(getdate()) * 100) + 3 - 100 
     else (year(getdate()) * 100) + 3 
     end 
+0

這很好! :) – gofr1

+0

它沒有給出確切的結果爲基礎的財政年度 – mohan111

相關問題