每年我都必须更新公司的财务报告以包括新的财政年度(因为这一年与日历年不同),所以我这样做......
Case
when ST_date >= '1996.11.01 00:00:00' and st_date < '1997.11.01 00:00:00'
then '96-97'
[etc]
end as year,
每年我都必须记住我需要修改哪些报告——大多数年份我都忘记了一个!
...是否有一种简单的动态方法来确定这一点?
每年我都必须更新公司的财务报告以包括新的财政年度(因为这一年与日历年不同),所以我这样做......
Case
when ST_date >= '1996.11.01 00:00:00' and st_date < '1997.11.01 00:00:00'
then '96-97'
[etc]
end as year,
每年我都必须记住我需要修改哪些报告——大多数年份我都忘记了一个!
...是否有一种简单的动态方法来确定这一点?
您绝对可以在 SQL Server 中编写一个简单的存储函数来根据日期确定财政年度:
CREATE FUNCTION dbo.GetFinancialYear (@input DATETIME)
RETURNS VARCHAR(20)
AS BEGIN
DECLARE @FinYear VARCHAR(20)
SET @FinYear =
CASE
WHEN @INPUT >= '19961101' AND @input < '19971101' THEN '96-97'
WHEN @INPUT >= '19971101' AND @input < '19981101' THEN '97-98'
ELSE '(other)'
END
RETURN @FinYear
END
然后在所有查询中使用它。
SELECT
somedate, dbo.GetFinancialYear(somedate)
......
如果您需要添加新的财政年度 - 只需更新一个功能,您就完成了!
更新:如果你想让这完全动态,并且你可以依靠财政年度总是从 11 月 1 日开始的事实 - 然后使用这种方法:
CREATE FUNCTION dbo.GetFinancialYear (@input DATETIME)
RETURNS VARCHAR(20)
AS BEGIN
DECLARE @FinYear VARCHAR(20)
DECLARE @YearOfDate INT
IF (MONTH(@input) >= 11)
SET @YearOfDate = YEAR(@input)
ELSE
SET @YearOfDate = YEAR(@input) - 1
SET @FinYear = RIGHT(CAST(@YearOfDate AS CHAR(4)), 2) + '-' + RIGHT(CAST((@YearOfDate + 1) AS CHAR(4)), 2)
RETURN @FinYear
END
这将返回:
05/06
对于一个日期,如2005-11-25
04/05
对于一个日期,如2005-07-25
看看这个例子:
declare @ST_Date datetime = '20120506'
SELECT
convert(char(2),DateAdd(m,-10,@ST_DATE),2)+'-'+
convert(char(2),DateAdd(m,+ 2,@ST_DATE),2) as year
作为列表达式:
convert(char(2),DateAdd(m,-10,ST_DATE),2)+'-'+
convert(char(2),DateAdd(m,+ 2,ST_DATE),2) as year
相当琐碎!
我处理这些问题(财政年度、支付期等)的方式是认识到财政年度与任何一年都一样,除了它们在 X 个月后开始。因此,直接的解决方案是将 FY 按月数移回日历年,从中进行任何“年度”比较或“年”(或“月”)的推导。
Declare @FinancialMonth Varchar(100)=NULL,@Month smallint,@Date DateTime='04/06/2013'
BEGIN TRY
SELECT @FinancialMonth='01-'+IsNULL(@FinancialMonth,'April')+'-'+Cast(year(getdate()) as varchar)
SELECT @Month=(Month(Cast(@FinancialMonth as datetime))-1) * -1
END TRY
BEGIN CATCH
SELECT
ERROR_NUMBER() AS ErrorNumber,'Invalid Financial Month' ErrorMessage
END CATCH
SELECT Month((CONVERT([varchar](10),dateadd(month,(@Month),@Date),(101)))) FinancialMonth,
Year((CONVERT([varchar](10),dateadd(month,(@Month),@Date),(101)))) FinancialYear
,DatePart(qq,(CONVERT([varchar](10),dateadd(month,(@Month),@Date),(101)))) FinancialQuarter
这个对我有用,并将其设置为实际的财政年度结束日期。
SET @enddatefy = convert(DATE, str(datepart(yyyy,DateAdd(m,-6,@enddate))+1)+'0630',112)
SET @enddatefyid = str(datepart(yyyy,DateAdd(m,-6,@enddate))+1)+'0630'
datename(YEAR, DATEADD(M,-3,Date)) +'-'+ cast((datepart(YEAR, DATEADD(M,-3,Date)) + 1) %100 as varchar(2))
计算列“日期”
财政年度范围为 4 月 1 日至 3 月 31 日
Create FUNCTION dbo.GetFinancialYear (@input DATETIME)
RETURNS VARCHAR(20)
AS BEGIN
DECLARE @FinYear VARCHAR(20)
IF (MONTH(@input) > 3)
SET @FinYear = RIGHT(CAST(Year(@input) AS CHAR(4)), 4) + '-' + RIGHT(CAST((Year(@input) + 1) AS CHAR(4)), 2)
ELSE
SET @FinYear = RIGHT(CAST((Year(@input) - 1) AS CHAR(4)), 4) + '-' + RIGHT(CAST(Year(@input) AS CHAR(4)), 2)
RETURN @FinYear
END
Declare @date1 datetime = '2017-07-01'
Select Case
When Month(@date1)>=7 Then 'FY'+Convert(NVARCHAR(10),(Right(year(getdate()),2)+1))
Else 'FY'+Convert(NVARCHAR(10),(Right(year(getdate()),2)))
End
这适用于我,财政年度从 7 月开始。
CASE WHEN DatePart(mm, [YourDate]) >= 7
THEN convert(varchar(10), YEAR([YourDate])) +' / '+ Convert(varchar(10), YEAR([YourDate]) + 1 )
ELSE Convert(varchar(10), YEAR([YourDate]) - 1) +' / '+ Convert(varchar(10), YEAR([YourDate]) )
END AS [Financial Year],