Вы можете попробовать использовать функцию 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](https://i.stack.imgur.com/8T6MF.png)
Существует альтернатива: 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()))
)