仅适用于当前财政年度日期的动态 SQL

Posted

技术标签:

【中文标题】仅适用于当前财政年度日期的动态 SQL【英文标题】:Dynamic SQL for current financial year dates only 【发布时间】:2012-01-30 14:36:40 【问题描述】:

我有一个数据库,其中包含我关心的两个日期。

开始日期 + 结束日期

这些日期以下列格式存储:

2008-06-23 00:00:00.000

我需要添加一条动态 SQL 以仅返回当前财政年度的日期。

因此,例如 01/04/2011 - 31/03/2012 将是本财政年度。

因此,结束日期在这些日期内或为 NULL 的任何记录都被归类为“活动”

年度部分需要是动态的,这样一到 2012 年 4 月 1 日,我们就会进入新的财政年度,并将从 2012 年 1 月 4 日到 2013 年 3 月 31 日恢复数据,以此类推。

能否建议一些代码或指出我忽略的任何规则?

【问题讨论】:

不应该是从 01/04/2012 - 31/03/13 回来吗? 这些日期真的是以这种格式存储为字符串还是存储在 DateTime 字段中? 这是美国财政年度吗? 英国财政年度,并存储为 DateTime 字段 【参考方案1】:

试试:

...
where StartDate >= 
    case 
        when month(getdate()) > 3 
            then convert(datetime, cast(year(getdate()) as varchar) + '-4-1')
        else 
            convert(datetime, cast(year(getdate()) - 1 as varchar) + '-4-1')
    end 
and (EndDate is null or EndDate < 
    case 
        when month(getdate()) > 3 
            then convert(datetime, cast(year(getdate()) + 1 as varchar) + '-4-1')
        else 
            convert(datetime, cast(year(getdate()) as varchar) + '-4-1')
    end)

【讨论】:

更新了 where 子句来处理 NULLEndDate。 当有 23 条记录符合当前财政年度时,没有带回任何东西:结束日期是:01/06/2011 01/06/2011 01/06/2011 01/06/2011 01 /06/2011 24/05/2011 05/10/2011 19/12/2011 24/11/2011 01/06/2011 14/10/2011 25/06/2011 04/04/2011 06/04/2011 07 /04/2011 01/06/2011 02/06/2011 25/06/2011 24/11/2011 15/07/2011 01/04/2011 04/04/2011 23/11/2011【参考方案2】:

我们开始吧:)

动态解决方案,

DECLARE @MyDate DATETIME
SET @MyDate = getDate()

DECLARE @StartDate DATETIME
DECLARE @EndDate DATETIME

SET @StartDate = DATEADD(dd,0, DATEDIFF(dd,0, DATEADD( mm, -(((12 + DATEPART(m, @MyDate)) - 4)%12), @MyDate ) - datePart(d,DATEADD( mm, -(((12 + DATEPART(m, @MyDate)) - 4)%12),@MyDate ))+1 ) )
SET @EndDate = DATEADD(ss,-1,DATEADD(mm,12,@StartDate ))

SELECT @StartDate,@EndDate

【讨论】:

【参考方案3】:

创建一个包含financial_year_startfinancial_year_end 字段的Finacial_Year 查找表。

用未来 50 年的数据填充它(使用电子表格计算日期很容易)。

使用enddate将您的表加入查找表

SELECT ...
FROM Your_Table LEFT JOIN Financial_Year
ON Your_Table.enddate BETWEEN Financial_Year.financial_year_start
    AND Financial_Year.financial_year_end
WHERE Your_Table.enddate IS NULL -- Active 
    OR (getdate() BETWEEN Financial_Year.financial_year_start
    AND Financial_Year.financial_year_end)

当当前日期介于接下来的两个日期之间时,当前财务将自动更改。

顺便说一句,英国财政年度从 06-04-YYYY 到 05-04-YYYY,而不是从 1 日到 31 日。

【讨论】:

以上是关于仅适用于当前财政年度日期的动态 SQL的主要内容,如果未能解决你的问题,请参考以下文章

获取财政年度查询中的动态日期范围的逻辑

如何在oracle sql developer中按年和月分组获取当前财政年度的数据?

在画面中寻找适用于财政年度的 YOY YTD 公式

需要在 Oracle 11g DB 中创建财政年度条目

SQL 填充每月总工作日减去当前财政年度的银行假期

返回财政年度的第一天(4 月 1 日)T-SQL