( @@DateFirst + DatePart( weekday, SampleDate ) - 1 ) % 7 + 1
将始终返回一个整数 from 0
to6
对应0
于周日,无论是否设置DateFirst
字符串Language
操作。
将表达式调整为( @@DateFirst + DatePart( weekday, SampleDate ) - 2 ) % 7
将周期的开始时间从星期日转移到星期一以及范围0
,6
进而简化以下代码:
create function dbo.FiscalYear( @Date as Date )
returns Int
begin
return Year( @Date ) - case
when Month( @Date ) <= 2 then 1 -- January and February are always part of the prior year.
-- In March it is the prior year only in the first week and if the calculated
-- DoW is less than the day of the month.
when Month( @Date ) = 3 and Day( @Date ) < 7 and
( @@DateFirst + DatePart( weekday, @Date ) - 2 ) % 7 >= Day( @Date ) then 1
else 0 end;
end;
用样本数据测试函数:
with
-- Generate sample dates for 20 years.
YearOffsets as (
select 0 as YearOffset
union all
select YearOffset + 1
from YearOffsets
where YearOffset < 20 ),
SampleDates as (
select Cast( DateAdd( year, YearOffset, '2000-02-28' ) as Date ) as SampleDate, 1 as Counter
from YearOffsets
union all
select DateAdd( day, 1, SampleDate ), Counter + 1
from SampleDates
where Counter < 10 )
-- Calculate the Fiscal Year for each sample date.
select SampleDate, DateName( weekday, SampleDate ) as WeekDay,
( @@DateFirst + DatePart( weekday, SampleDate ) - 2 ) % 7 as DayOfWeek, -- 0 = Monday.
dbo.FiscalYear( SampleDate ) as FiscalYear
from SampleDates
order by SampleDate;