Как вы вычислили финансовый год из поля даты в представлении в SQL Server?
Вычислить финансовый год в SQL Server
Ответ 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'))