【问题标题】:how to get data dynamically in view basing on fiscal year如何根据会计年度动态获取数据
【发布时间】:2016-09-30 08:49:25
【问题描述】:

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

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

    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 server 脚本或存储过程中解决它,但如何在 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) 的数据 但是我该如何使用它并创建一个 VIEW

【问题讨论】:

  • 您能否详细说明究竟是什么决定了您的查询的开始/结束日期?

标签: sql sql-server tsql view dynamic-view


【解决方案1】:

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

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

【讨论】:

  • 我只想在 View 中使用这段代码,而不是在 UDF 中
【解决方案2】:

你可以试试这样的:

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】:

    您可以在视图中使用 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)
    

    【讨论】:

    • 这很好..有些地方我忘记了 CTE
    【解决方案4】:
    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
    

    【讨论】:

    • 它没有给出基于财政年度的确切结果
    猜你喜欢
    • 2019-07-12
    • 1970-01-01
    • 1970-01-01
    • 2021-03-16
    • 1970-01-01
    • 1970-01-01
    • 2019-11-22
    • 1970-01-01
    • 2012-12-07
    相关资源
    最近更新 更多