这就是我将如何使用帮助函数。
declare @StartMin datetime
declare @StopMax datetime
select @StartMin = min(start),
@StopMax = max(isnull(stop, getdate()))
from MyTable
select Years.[Year],
count(1) [Count]
from MyTable mt
join [dbo].[YearsBetween](@StartMin, @StopMax) as Years
on Years.[Year] between Year(mt.start) and Year(isnull(mt.stop, getdate()))
group by Years.[Year]
order by Years.[Year]
这是辅助功能,我有很多人,DatesBetween,MonthsBetween,NumbersBetween等
create function [dbo].[YearsBetween](@Start datetime, @Stop datetime)
returns @Years TABLE
(
[Year] int
)
begin
declare @StartYear int
declare @StopYear int
set @StartYear = year(@Start)
set @StopYear = year(@Stop)
while(@StartYear <= @StopYear)
begin
insert into @Years
values(@StartYear)
set @StartYear = @StartYear + 1
end
return;
end
使用派生表的子查询/的/ CTE,而不是真正的表 – lad2025
如果您需要声明可以在SQL Server和Firebird中使用,那么这是不太可能的。例如,从日期中提取年份的函数在两个数据库中是不同的 –
为什么不创建一个包含数字1到一些任意大数(如1000)的永久性单列表并使用它来生成一系列年? – Bohemian