我有一種我以前從未見過的情況,從 2018 年 2 月 4 日開始的財政年度分解如下:
Q1 - 111 天 (2/4/2018 - 5/26/2018)
Q2 - 83 天 (5/27/2018 - 8/18/2018)
Q3 - 83 天 (8/19/2018 - 11/ 2018 年 10 月)
第四季度 - 83 天(2018 年 11 月 11 日 - 2019 年 2 月 2 日)
這被認為是 2018 財年
下一年,即 2019 財年,從 2019 年 2 月 3 日開始,季度長度相同,第四季度將于 2020 年 2 月 1 日結束。2020 財年然后從 2020 年 2 月 2 日開始。
我需要能夠確定給定日期的財政年度和季度(下面我的代碼中的@testdate)。以下適用于 2018 財年:
declare @startdate date = '2/4/2018'
, @startyear int = 2018
, @testdate date = '2/5/2018'
select 'Fiscal Year' = case when datediff(dd, @startdate, @testdate) between 0 and 363 then @startyear else 0 end
select 'Fiscal Quarter' = case when datediff(dd, @startdate, @testdate) between 0 and 111 then 'Q1'
when datediff(dd, @startdate, @testdate) between 112 and 195 then 'Q2'
when datediff(dd, @startdate, @testdate) between 196 and 279 then 'Q3'
when datediff(dd, @startdate, @testdate) between 280 and 363 then 'Q4'
else 'Q0' end
問題是當我在 2018 財年第四季度(2019 年 2 月 2 日)結束之后有一個日期。我不確定如何讓超過該日期的任何日期自動落入日期范圍(0-111、112-195、196-279、280-363)。手動,對于 2019 財年,我可以從日期中減去 364,這似乎可行。對于 2020 財年,我可以減去 364 * 2 (728)。之后的每一年,繼續減去 364 * n,其中 n 是未來財政年度與 2018 財年之間的年數。
這適用于 2020 財年:
declare @startdate date = '2/4/2018'
, @startyear int = 2018
, @testdate date = '5/28/2020'
, @testdate2 date = null
set @testdate2 = dateadd(d, -728, @testdate)
select 'Fiscal Year' = case when datediff(dd, @startdate, @testdate2) between 0 and 363 then @startyear 2 else 0 end
select 'Fiscal Quarter' = case when datediff(dd, @startdate, @testdate2) between 0 and 111 then 'Q1'
when datediff(dd, @startdate, @testdate2) between 112 and 195 then 'Q2'
when datediff(dd, @startdate, @testdate2) between 196 and 279 then 'Q3'
when datediff(dd, @startdate, @testdate2) between 280 and 363 then 'Q4'
else 'Q0' end
我猜該解決方案圍繞如何自動計算 -728(即 364 * n)以及如何相應地增加 @startyear 展開。
關于如何用這些奇怪的財政季度確定給定日期的財政年度和季度的任何想法?
謝謝!
uj5u.com熱心網友回復:
這是一個解決方案,它進行整數除法以獲得 2018 年之后的年數。然后,我們從DATEDIFF基準年減去該數字的 364 倍,得到當前納稅年度開始的天數。我們可以使用您的案例陳述來確定季度。
create function dbo.quarter (@date date) returns varchar(100) as begin declare @days int = datediff(dd,'2018-04-02',@date) declare @years int = @days / 364 set @days = @days - (@years * 364) set @years = @years 2018 declare @quarter char(2)= case when @days between 0 and 111 then 'Q1' when @days between 112 and 195 then 'Q2' when @days between 196 and 279 then 'Q3' when @days between 280 and 363 then 'Q4' else 'Q0' end return concat(@years,'-', @quarter) end
GO?
select dbo.quarter('5/4/2018') quarter; select dbo.quarter('2020-04-02') quarter; select dbo.quarter('2022-01-24') quarter; select dbo.quarter(GETDATE()) quarter; select dbo.quarter('2021-12-25') quarter; GO| 季度 | | :-------- | | 2018-Q1 | | 季度 | | :-------- | | 2020-Q1 | | 季度 | | :-------- | | 2021-Q4 | | 季度 | | :-------- | | 2021-Q4 | | 季度 | | :-------- | | 2021-Q3 |
db<>在這里擺弄
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/432417.html
上一篇:回圈遍歷表并更新特定列
