Подтвердить что ты не робот

Вычислить финансовый год в SQL Server

Как вы вычислили финансовый год из поля даты в представлении в SQL Server?

4b9b3361

Ответ 1

Я предлагаю использовать пользовательскую функцию на основе финансового года вашего приложения.

CREATE FUNCTION dbo.fnc_FiscalYear(
    @AsOf           DATETIME
)
RETURNS INT
AS
BEGIN

    DECLARE @Answer     INT

    -- You define what you want here (September being your changeover month)
    IF ( MONTH(@AsOf) < 9 )
        SET @Answer = YEAR(@AsOf) - 1
    ELSE
        SET @Answer = YEAR(@AsOf)


    RETURN @Answer

END



GO

Используйте его следующим образом:

SELECT dbo.fnc_FiscalYear('9/1/2009')


SELECT dbo.fnc_FiscalYear('8/31/2009')

Ответ 2

CASE WHEN MONTH(@Date) > 10 THEN YEAR(@Date) + 1 ELSE YEAR(@Date) END

Ответ 3

Вот код даты начала финансового года Австралии

 select DATEADD(dd,0, DATEDIFF(dd,0, DATEADD( mm,
 -(((12 + DATEPART(m, getDate())) - 7)%12), getDate() ) 
 - datePart(d,DATEADD( mm, -(((12 + DATEPART(m, getDate())) - 7)%12),getDate() ))+1 ) )

Он возвращается как '2012-07-01 00:00:00.000'

Ответ 4

CASE 
  WHEN MONTH(Date) > 6 
   THEN YEAR(Date) + 1
   ELSE YEAR(Date)
  END AS [FISCAL YEAR]

В этом случае финансовый год начинается с 7/1. Это самое простое решение.

Ответ 5

Простейшее выражение для этого случая: YEAR(DATEADD(month, 3, Date))

Федеральный финансовый год

Финансовый год является отчетным периодом федерального правительства. Он начинается 1 октября и заканчивается 30 сентября следующего календарного года. Каждый финансовый год идентифицируется календарным годом, в котором он заканчивается, и обычно упоминается как "FY". Например, 2003 финансовый год начался 1 октября 2002 года и заканчивается 30 сентября 2003 года... целью было предоставить Конгрессу больше времени для обработки законодательства об ассигнованиях, особенно во избежание принятия дальнейших резолюций.

Это может не относиться к другим странам и регионам, кроме США, но вам просто нужно заменить номер 3 в соответствии с вашими потребностями.

Ответ 6

Я распространил ответ, опубликованный ChrisF и Conficker.

DECLARE @FFYStartMonth INT = 10 --The first month of the FFY
DECLARE @EntryDate DATETIME = '4/1/2015' --The date of the data
DECLARE @StartDate DATETIME

DECLARE @EndDate DATETIME

SET @StartDate = DATEADD(dd, 0,
    DATEDIFF(dd, 0,
        DATEADD(mm, - (((12 + DATEPART(m, @EntryDate)) - @FFYStartMonth)%12), @EntryDate) -
datePart(d,DATEADD(mm, - (((12 + DATEPART(m, @EntryDate)) - @FFYStartMonth )%12),
    @EntryDate )) + 1 ))  

SET @EndDate = DATEADD(SS, -1, DATEADD(mm, 12, @StartDate))

SELECT @StartDate, @EndDate

Ответ 7

Я не думаю, что вы можете, потому что нет универсального фискального календаря. Финансовые годы различаются между предприятиями и странами.

ДОБАВЛЕНИЕ: то, что вам нужно будет сделать, это иметь отдельную таблицу БД, состоящую из даты фискального начала и фискальную дату окончания для каждого применимого года. Используйте данные в этой таблице для расчета финансового года с определенной датой.

Ответ 8

Для этого вам понадобится больше одного поля...

Вы должны проверить свое определение финансового года, поскольку оно варьируется от компании к компании.

Ответ 9

Данный @FiscalYearStartMonth - это месяц начала месяца финансового года (числовой) и @Date - дата, о которой идет речь, выполните следующие действия:

SELECT 
  CASE 
      WHEN @FiscalYearStartMonth = 1 OR @FiscalYearStartMonth > MONTH(@Date) 
      THEN YEAR(@Date) 
      ELSE YEAR(@Date) + 1 
  END AS FiscalYear

Вы можете абстрагировать это в функции или использовать в качестве столбца в производном представлении

Ответ 10

Я только понял, что отмеченный ответ Бретт Веннстра ошибочен. Не следует ли рассчитывать FY следующим образом:

CREATE FUNCTION dbo.fnc_FiscalYear(
    @AsOf           DATETIME
)
RETURNS INT
AS
BEGIN
    DECLARE @Answer     INT
    IF ( MONTH(@AsOf) < 9 )
        SET @Answer = YEAR(@AsOf) 
    ELSE
        SET @Answer = YEAR(@AsOf) + 1
    RETURN @Answer
END;

Ответ 11

Вот динамический код для Великобритании,

Вы можете работать на основе различных потребностей,

DECLARE @StartDate DATETIME

DECLARE @EndDate DATETIME

SET @StartDate = DATEADD(dd, 0,
    DATEDIFF(dd, 0,
        DATEADD(mm, - (((12 + DATEPART(m, getDate())) - 4)%12), getDate()) -
    datePart(d,DATEADD(mm, - (((12 + DATEPART(m, getDate())) - 4)%12),
        getDate() )) + 1 ))  

SET @EndDate = DATEADD(SS, -1, DATEADD(mm, 12, @StartDate))

SELECT @StartDate, @EndDate

Ответ 12

    declare 
@InputDate datetime,
@FiscalInput varchar(2),
@FiscalYear varchar(4),
@FiscalMonth varchar(2),
@FiscalStart varchar(10),
@FiscalDate varchar(10)

set @FiscalInput = '10'
set @InputDate = '1/5/2010'
set @FiscalYear = (select 
                    case 
                    when datepart(mm,@InputDate) < cast(@FiscalInput as int)
                        then datepart(yyyy, @InputDate)
                    when datepart(mm,@InputDate) >= cast(@FiscalInput as int)
                        then datepart(yyyy, @InputDate) + 1
                        end FiscalYear)


set @FiscalStart = (select @FiscalInput + '/01/' + @FiscalYear)

set @FiscalDate = (select cast(datepart(mm,@InputDate) as varchar(2)) + '/' + cast(datepart(dd,@InputDate) as varchar(2)) + '/' + @FiscalYear)
set @FiscalMonth = (select 
                    case 
                    when datepart(mm,@InputDate) < cast(@FiscalInput as int)
                        then 13 + datediff(mm, cast(@FiscalStart as datetime),@InputDate)
                    when datepart(mm,@InputDate) >= cast(@FiscalInput as int)
                        then 1 + datediff(mm, cast(@FiscalStart as datetime), @FiscalDate)
                        end FiscalMonth)    

select @InputDate as Date, 
cast(@FiscalStart as datetime) as FiscalStart, 
dateadd(mm, 11,cast(@FiscalStart as datetime)) as FiscalStop,
cast(@FiscalDate as DateTime) as FiscalDate,
@FiscalMonth as FiscalMonth, 
@FiscalYear as FiscalYear

Ответ 13

Начало финансового года:

DATEADD(MONTH, DATEDIFF(MONTH, '20100401', getdate()) / 12 * 12, '20100401')

Конец финансового года:

DATEADD(MONTH, DATEDIFF(MONTH, '20100401', getdate()) / 12 * 12, '20110331')

Замените getdate() своей собственной датой, если требуется

Ответ 14

DECLARE 
@StartDate DATETIME,
@EndDate DATETIME

if month(getdate())>3
Begin
        set  @StartDate=   convert(datetime, cast(year(getdate())-1 as varchar) + '-4-1')
        set @EndDate= convert(datetime, cast(year(getdate())  as varchar) + '-3-31')

end

else   
begin          
        set @StartDate= Convert(datetime, cast(year(getdate()) - 2 as varchar) + '-4-1')
        set @EndDate= convert(datetime, cast(year(getdate())-1 as varchar) + '-3-31')
end


select @StartDate, @EndDate

Ответ 15

Здесь моя версия, которая возвращает финансовый год как FYyyyy - финансовый год начинается 7/1

то есть. 6/1/2015 → FY1415, 7/1/2015 → FY1516

Строковые функции могут быть лучше...

        CREATE FUNCTION [dbo].[FY](@DATE DATETIME)
        RETURNS char(6)
        AS
        BEGIN
            DECLARE @Answer     char(6)
            SET @Answer =    
            CASE WHEN MONTH(@DATE) < 7 
                 THEN 'FY' + RIGHT(CAST(YEAR(@DATE) - 1 AS VARCHAR(11)), 2) + RIGHT(CAST(YEAR(@DATE) AS VARCHAR(11)), 2) 
                 ELSE 'FY' + RIGHT(CAST(YEAR(@DATE) AS VARCHAR(11)), 2) + RIGHT(CAST(YEAR(@DATE) + 1 AS VARCHAR(11)), 2) END
            RETURN @Answer
        END

Ответ 16

Основываясь на приведенном выше ответе @csaba-toth, и предположим, что ваш финансовый год начинается в первый день месяца

year(dateadd(month, (12 - FyStartMonth + 1), <date>)

Мой финансовый год начинается 1 июля, 7-го месяца, поэтому моя константа (12 - 7 + 1 =) 6.

Контрольные примеры (по состоянию на 25 сентября 2019 года):

select year(dateadd(month, 6, getdate()))
, year(dateadd(month,6, '1/1/2020'))
, year(dateadd(month, 6, '7/1/2020'))
, year(dateadd(month, 6, '6/30/2020'))

Returns:

2020    2020    2021    2020

Я верю, что это самая простая и, возможно, самая понятная реализация.

Ответ 17

Проще всего для австралийцев:)

(ГОД (DATEADD (месяц, - ((DATEPART (месяц, [дата]) + 5)% 12), [Дата])) +) AS Financial_Year

Ответ 18

Простой способ -

DECLARE @DATE DATETIME = '2016/07/1'
- Налоговый старт SELECT CONVERT (DATETIME, (CAST (YEAR (@DATE) - IIF (MONTH (@DATE) > 6, 0, 1) AS VARCHAR) + '-7-1'))

- Фискальный конец SELECT CONVERT (DATETIME, (CAST (YEAR (@DATE) + IIF (MONTH (@DATE) > 6, 1, 0) AS VARCHAR) + '-6-30'))