Comment calculeriez-vous l'année fiscale à partir d'un champ de date dans une vue SQL Server?
Je vous suggère d'utiliser une fonction définie par l'utilisateur basée sur l'exercice de votre application.
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
Utilisez-le comme ceci:
SELECT dbo.fnc_FiscalYear('9/1/2009')
SELECT dbo.fnc_FiscalYear('8/31/2009')
CASE WHEN MONTH(@Date) > 10 THEN YEAR(@Date) + 1 ELSE YEAR(@Date) END
Voici le code de début de l'exercice financier australien
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 ) )
Il revient comme '2012-07-01 00:00:00.000'
Expression la plus simple pour ce cas: YEAR(DATEADD(month, 3, Date))
L'exercice est la période comptable du gouvernement fédéral. Il commence le 1er octobre et se termine le 30 septembre de la prochaine année civile. Chaque exercice financier est identifié par l'année civile dans laquelle il se termine et est communément appelé "FY". Par exemple, l'exercice 2003 a commencé le 1er octobre 2002 et se termine le 30 septembre 2003 ... L'intention était de fournir au Congrès de plus de temps pour traiter la législation des crédits, en particulier pour éviter les résolutions persistantes.
Cela peut ne pas s'appliquer à d'autres pays et régions que les États-Unis, mais il vous suffit de remplacer le numéro 3 en fonction de vos besoins.
Je ne pense pas que vous puissiez, car il n'y a pas de calendrier fiscal universel. Les exercices varient entre les entreprises et les pays.
Addenda: Ce que vous devriez avoir à faire, c'est avoir une table DB distincte constituée d'une date de début fiscale et d'une date de fin financière pour chaque année applicable. Utilisez les données dans ce tableau pour calculer l'exercice financier donné une date donnée.
Vous auriez besoin de plus qu'un seul champ pour faire cela ...
Vous devriez vérifier votre définition de l'exercice car il varie d'une entreprise à la société
Je viens de réaliser que la réponse marquée de Brett Veenstra est fausse. Le fy ne devrait pas être calculé comme ça?:
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;
Début d'année fiscale:
Daaddd (mois, DaturdeIff (mois, '20100401', getDate ())/12 * 12, '20100401') [.____]
Fin d'année fiscale:
Daaddd (mois, datrodiff (mois, '20100401', getDate ())/12 * 12, '20110331') [.____]
Remplacer getdate()
avec votre propre date si nécessaire
Construire sur la réponse ci-dessus par @ Csaba-Toth et en supposant que votre exercice commence le premier jour du mois
year(dateadd(month, (12 -
FystartMonth+ 1), <date>)
Mon fy commence le 1er juillet, le 7ème mois, donc ma constante est (12 -7 + 1 =) 6.
Cas de test (à partir du 25 septembre 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'))
Retour:
2020 2020 2021 2020
Je crois que c'est la mise en œuvre la plus simple et peut-être la plus compréhensible.
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
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
Voici ma version qui retourne l'exercice financier comme Fyyyyy - l'année fiscale commence 7/1
i.E. 6/1/2015 -> FY1415, 19/07/2015 -> FY1516
Les fonctions de chaîne pourraient être meilleures ...
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