web-dev-qa-db-fra.com

Calculer l'exercice financier dans SQL Server

Comment calculeriez-vous l'année fiscale à partir d'un champ de date dans une vue SQL Server?

16
R0b0tn1k

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')
20
Brett Veenstra
CASE WHEN MONTH(@Date) > 10 THEN YEAR(@Date) + 1 ELSE YEAR(@Date) END
11
R0b0tn1k

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'

10
Mouli

Expression la plus simple pour ce cas: YEAR(DATEADD(month, 3, Date))

L'exercice fédéral

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.

2
Csaba Toth

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.

1
alex

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é

1
Andrew G. Johnson

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;
1
gnarbarian

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

0
Simon

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.

0
BobHy
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
0
    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
0
Wolfsvein

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
0
rheitzman