Самый эффективный способ рассчитать первый день текущего финансового года?
Какой самый эффективный способ рассчитать первый день текущего (австралийского) финансового года?
Австралийский FY начинается с 01 июля.
например.
SELECT dbo.FinancialYearStart('30-Jun-2011')
возвращает 01-июл-2010.
SELECT dbo.FinancialYearStart('01-Jul-2011')
возвращает 01-июль-2011.
SELECT dbo.FinancialYearStart('02-Jul-2011')
возвращает 01-июль-2011.
Ответы
Ответ 1
Один DATEADD, один DATEDIFF и деление:
SELECT DATEADD(year,DATEDIFF(month,'19010701','20110630')/12,'19010701')
В принципе, вы считаете количество месяцев с какой-то произвольной даты начала финансового года (я выбрал 1901), разделите это число на 12 (игнорируя остальную часть) и добавьте, что много лет назад к той же произвольной дате начала года.
Ответ 2
Я не знаю, является ли это наиболее эффективным, но это по крайней мере быстро...
create function dbo.FinancialYearStart
(
@CurrentDate datetime
)
returns datetime
as
begin
declare @CurrentYear int
,@FYDateThisYear datetime
,@FYDatePrevYear datetime
set @CurrentYear = datepart(year, @CurrentDate)
set @FYDateThisYear = '01-Jul-' + cast(@CurrentYear as varchar(4))
set @FYDatePrevYear = '01-Jul-' + cast(@CurrentYear-1 as varchar(4))
if @CurrentDate < @FYDateThisYear
begin
return @FYDatePrevYear
end
return @FYDateThisYear
end
Ответ 3
Извлечь год и месяц с даты. Тогда do year = year + FLOOR((month-7) / 6)
Затем ваша дата 1-jul-year
(Вам не нужно хранить их как переменные.)
Что-то вроде: CONCATENATE('01-jul-', YEAR(date) + FLOOR((MONTH(date)-7) / 6)
Ответ 4
Несколько сложный метод (возможно, слишком маленький):
SELECT
DATEADD(month,
(MONTH(GETDATE()) - 1) / 6 * 12 - 6,
CAST(CAST(YEAR(GETDATE()) AS varchar) AS datetime)
)
Ответ 5
Clunky, но он работает
select
cast('01-Apr-' +
cast(
case
when datepart(mm,getdate()) in (4,5,6,7,8,9,10,11,12)
then DATEPART(yy,getdate())
else DATEPART(yy,getdate())-1
end as varchar
) as datetime
) as fy_start