Как привести финансовые годы в Индии по месяцам, используя SQL запрос на выборку? - PullRequest
0 голосов
/ 05 февраля 2020

Мне нужен финансовый год, как указано ниже. в Индии финансовый год начинается с 1 April до 31 March в каждом году.

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

Я хочу получить результат ниже и выбрать запрос в столбцах с 2018 по текущую дату, если новый апрельский месяц начинается тогда снова должно появиться новое раскрывающееся значение, например 2020 год назад, а если текущий месяц April 2021, то новое раскрывающееся значение 2021 - 2022 должно появиться следующим образом.

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

Ответы [ 3 ]

1 голос
/ 05 февраля 2020

это даст вам текущий и предыдущий финансовый год. Он использует 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]
1 голос
/ 05 февраля 2020

Вы можете попробовать использовать функцию datefromparts(), как показано ниже. Вот официальная документация DATEFROMPARTS (Transact- SQL) .

Эта функция возвращает значение даты, которое сопоставляется с указанными значениями года, месяца и дня.

Синтаксис

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

Вывод такой, как показано ниже image.

enter image description here

Существует альтернатива: cte вам не нужна таблица, как показано ниже.

-- 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 .

Edit

Если вы используете 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

Если вы хотите исключить финансовый год, в котором номер месяца равен Jan, Fab или March, вы можете написать условие для этого, как показано ниже.

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()))
    )
0 голосов
/ 05 февраля 2020

Я знаю, это немного долго, но это будет работать.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...