如何使用 SQL select 查询将印度财政年度作为月份的基础?

How to bring India financial years base on month using SQL select query?

我需要以下格式的财政年度。在印度,每年的财政年度从 1 April31 March

1. Example 1 April 2018 to 31 march 2019 (2018 - 2019).
2. Example 1 April 2019 to 31 march 2020 (2019 - 2020).

我想要下面的输出,select 查询需要从 2018 年到当前日期的列下方,如果新的四月开始,那么新的下拉值应该再次出现,例如 2020 年前,如果当前月 April 2021 那么新的下拉值 2021 - 2022 应该是这样的。

Year       FinancialYear
------------------------
2018       2018-2019 
2019       2019-2020

您可以尝试使用 datefromparts() 功能,如下所示。这里是DATEFROMPARTS (Transact-SQL).

的官方文档

此函数 returns 映射到指定年月日值的日期值。

语法

DATEFROMPARTS ( year, month, day )

下面是适合您的实现。

create table FinancialYear (Year int)
insert into FinancialYear values (2018), (2019), (2020)

Select Year, 
       Cast(Year as Varchar(4)) + '-' + Cast(year + 1 as varchar(4)) as FinancialYear
       ,datefromparts(year, 4, 1) as [StartingDate]
       ,datefromparts(year + 1 , 3, 31) as [EndingDate] 
from FinancialYear

Live Demo

输出如下图所示。

有一个替代方案,使用 cte 您不需要 table,如下所示。

-- Define start and end limits
Declare @start int, @end int
Select @start = 2018, -- As you want
@end = year(getdate()) --Current Year

;With NumberSequence( Year ) as
(
    Select @start as Year
        union all
    Select Year + 1
        from NumberSequence
        where Year < @end
)

--Select result
Select Year, 
       Cast(Year as Varchar(4)) + '-' + Cast(year + 1 as varchar(4)) as FinancialYear
       ,datefromparts(year, 4, 1) as [StartingDate]
       ,datefromparts(year + 1 , 3, 31) as [EndingDate] 
from NumberSequence Option (MaxRecursion 1000)

这里是 Live Demo.

编辑

如果您使用的是 SQL Server 2005,那么您的查询将如下所示。

insert into FinancialYear values (2018)
insert into FinancialYear values (2019)
insert into FinancialYear values (2020)

Select Year, 
       Cast(Year as Varchar(4)) + '-' + Cast(year + 1 as varchar(4)) as FinancialYear
       ,CAST(Convert(Varchar(4), year) + '-' + '4' + '-' + '1' as DATETime) as [StartingDate]
       ,CAST(Convert(Varchar(4), year + 1) + '-' + '3' + '-' + '31' as DateTime) as [EndingDate] 
from FinancialYear

如果您想排除月份数为 JanFabMarch 的财政年度,那么您可以如下编写 where 条件。

Select Year, 
       Cast(Year as Varchar(4)) + '-' + Cast(year + 1 as varchar(4)) as FinancialYear
       ,CAST(Convert(Varchar(4), year) + '-' + '4' + '-' + '1' as DATETime) as [StartingDate]
       ,CAST(Convert(Varchar(4), year + 1) + '-' + '3' + '-' + '31' as DateTime) as [EndingDate] 
from FinancialYear
where (
    (ISNULL(month(getdate()), 0) >= 4 ) 
    OR 
    (ISNULL(month(getdate()), 0) < 4 AND Year < year(getdate()))
    )

我知道它有点冗长,但它会起作用。

drop table if exists #asa
declare @getdate datetime='2025-04-06 00:00:00.000'
DECLARE @FromDate varchar(30),@ToDate varchar(30),@datediff2018 INT=CONVERT(INT,datediff(day,'2017-04-01',@getdate)/365.25)


create table #asa
(
Year varchar(10),
FY varchar(20)
)
WHILE(@datediff2018>0)
BEGIN
    IF(MONTH(@getdate)>=4 AND MONTH(@getdate)<=12)
    BEGIN
    SET @FromDate=CONVERT(VARCHAR(10),YEAR(dateadd(year,-@datediff2018+1,@getdate)))+'-04-01'
    END
    ELSE IF(MONTH(@getdate)>=1 AND MONTH(@getdate)<=3)
    BEGIN
    SET @FromDate=CONVERT(VARCHAR(10),YEAR(dateadd(year,-@datediff2018+1,@getdate))-1)+'-04-01'
    END

    IF(MONTH(@getdate)>=4 AND MONTH(@getdate)<=12)
    BEGIN
    SET @ToDate=CONVERT(VARCHAR(10),YEAR(dateadd(year,-@datediff2018+1,@getdate))+1)+'-03-31'
    END
    ELSE IF(MONTH(@getdate)>=1 AND MONTH(@getdate)<=3)
    BEGIN
    SET @ToDate=CONVERT(VARCHAR(10),YEAR(dateadd(year,-@datediff2018+1,@getdate)))+'-03-31'
    END

    insert into #asa
    select YEAR(@FromDate),CONVERT(VARCHAR,YEAR(@FromDate))+'-'+CONVERT(VARCHAR,YEAR(@ToDate))
    set @datediff2018=@datediff2018-1
END
select * from #asa

这将为您提供当前和上一个财政年度。它使用 Table Value Contructor 生成 2 行

select  datename(year, dateadd(month, -3, [date])) as [Year],
        datename(year, dateadd(month, -3, [date])) 
        + '-' + 
        datename(year, dateadd(month, +9, [date])) as [FinancialYear]
from    (
            values 
            (dateadd(year, -1, getdate())), -- previous fy
            (getdate())                     -- current financial year
        ) as fy ([date])
order by [date]