计算当前财政年度第一天的最有效方法是什么?

时间:2011-07-19 08:34:25

标签: sql sql-server tsql

计算当前(澳大利亚)财政年度第一天的最有效方法是什么?

澳大利亚风云于7月1日开始。

E.g。

SELECT dbo.FinancialYearStart('30-Jun-2011')将于2010年7月1日返回。

SELECT dbo.FinancialYearStart('01-Jul-2011')将于2011年7月1日返回。

SELECT dbo.FinancialYearStart('02-Jul-2011')将于2011年7月1日返回。

6 个答案:

答案 0 :(得分:26)

一个DATEADD,一个DATEDIFF和一个部门:

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

基本上,你计算自某个任意财政年度开始日期以来的月数(我选择了1901年),将该数字除以12(忽略其余部分),然后将这几年加回到同一任意年份的开始日期

答案 1 :(得分: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

答案 2 :(得分:1)

从日期中提取年份和月份。然后执行year = year + FLOOR((month-7) / 6)

那么你的约会是1-jul-year

(您实际上不需要将它们存储为变量。)

类似于:CONCATENATE('01-jul-', YEAR(date) + FLOOR((MONTH(date)-7) / 6)

答案 3 :(得分:1)

一种有点复杂的方法(可能有点过分):

SELECT
  DATEADD(month,
          (MONTH(GETDATE()) - 1) / 6 * 12 - 6,
          CAST(CAST(YEAR(GETDATE()) AS varchar) AS datetime)
  )

答案 4 :(得分:1)

笨重但是有效

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

答案 5 :(得分:0)

SELECT  cast(cast(YEAR(getdate())-
        (case 
            when MONTH(GETDATE()) between 1 and 6 then 1
            else 0
        end) as varchar)+'0701' as date)