仅适用于当前财政年度日期的动态 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 子句来处理NULL
EndDate。
当有 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_start
和financial_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的主要内容,如果未能解决你的问题,请参考以下文章