Самый эффективный способ подсчета первого дня текущего финансового года? - PullRequest
11 голосов
/ 19 июля 2011

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

Австралийский финансовый год начинается 1 июля.

* 1005 Е.Г. *

SELECT dbo.FinancialYearStart('30-Jun-2011') возвращается 01.07.2010.

SELECT dbo.FinancialYearStart('01-Jul-2011') возвращается 01.07.2011.

SELECT dbo.FinancialYearStart('02-Jul-2011') возвращается 01.07.2011.

Ответы [ 6 ]

26 голосов
/ 19 июля 2011

Одна DATEADD, одна DATEDIFF и деление:

SELECT DATEADD(year,DATEDIFF(month,'19010701','20110630')/12,'19010701')

По сути, вы считаете количество месяцев с даты начала произвольного финансового года (я выбрал 1901), делите это число на 12(игнорируя остаток) и добавьте это много лет назад к дате начала того же произвольного года.

2 голосов
/ 19 июля 2011

Я не знаю, является ли это наиболее эффективным, но, по крайней мере, быстро ...

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
1 голос
/ 16 октября 2012

неуклюжий, но работает

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
1 голос
/ 19 июля 2011

Несколько сложный метод (возможно, немного слишком много):

SELECT
  DATEADD(month,
          (MONTH(GETDATE()) - 1) / 6 * 12 - 6,
          CAST(CAST(YEAR(GETDATE()) AS varchar) AS datetime)
  )
1 голос
/ 19 июля 2011

Извлечение года и месяца из даты. Тогда сделай year = year + FLOOR((month-7) / 6)

Тогда ваша дата 1 июля

(На самом деле вам не нужно хранить их как переменные.)

Что-то вроде: CONCATENATE('01-jul-', YEAR(date) + FLOOR((MONTH(date)-7) / 6)

0 голосов
/ 12 марта 2019
SELECT  cast(cast(YEAR(getdate())-
        (case 
            when MONTH(GETDATE()) between 1 and 6 then 1
            else 0
        end) as varchar)+'0701' as date)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...