3

如何动态创建视图以获取基于财政年度(财政年度)的数据。

让我们看看我有样本数据的样本数据。

    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 年 3 月到 2017 年 4 月。如果我在 2017 年 5 月运行视图,我需要从 2017 年 3 月到 2017 年 5 月获取数据。我可以在 Sql 中解决服务器脚本或存储过程,但如何在 Dynamic View 或 View 中获得相同的结果。建议我!

我的脚本

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)提供了我想要的数据,但我如何使用它并创建一个视图

4

4 回答 4

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
于 2016-06-01T08:12:31.873 回答
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)
于 2016-06-01T07:57:24.267 回答
0

如果您已经在脚本\存储过程中制定了代码,则可以在Table-Valued User-Defined Functions中重复使用此类代码。

这样您就可以像查看视图一样查询 UDF。

于 2016-06-01T06:57:20.400 回答
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)
于 2016-06-01T07:30:29.477 回答