Самый эффективный способ рассчитать первый день текущего финансового года?

Какой самый эффективный способ рассчитать первый день текущего (австралийского) финансового года?

Австралийский 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