T-SQL 日期范围选择
T-SQL Date Range Selection
我有一个 SQL 服务器数据库 table:
并且我正在尝试在某个 TypeID
的特定日期之间获得 RatePrice
,例如
DECLARE @StartDate DATE = '2022-02-26';
DECLARE @EndDate DATE = '2022-03-02';
DECLARE @TypeID int = 10;
DECLARE @RatePrice money;
DECLARE @RateDate DATE;
WHILE (@StartDate <= @EndDate)
BEGIN
SELECT
@RatePrice = RatePrice,
@RateDate = @StartDate
FROM mgaRate
WHERE mgaRate.TypeID = @TypeID
AND ((RateStart BETWEEN @StartDate AND @EndDate) OR
(RateEnd BETWEEN @StartDate AND @EndDate) OR
(RateStart <= @StartDate AND RateEnd >= @EndDate)
)
PRINT @RateDate;
PRINT @RatePrice;
SET @StartDate = DATEADD(day, 1, @StartDate);
END;
但结果不正确:
2022-02-26
400.00
2022-02-27
400.00
2022-02-28
400.00
2022-03-01
400.00
2022-03-02
400.00
二月份的价格应该是 300.00。
您可以使用日历 table 获取所需范围内的所有日期,对于每个日期,您都可以使用原始 table:[=12 中的子查询获取汇率=]
DECLARE @StartDate DATE = '2022-02-26';
DECLARE @EndDate DATE = '2022-03-02';
DECLARE @TypeID int = 10;
with calendar as (
select @StartDate as d
union all
select dateadd(day, 1, d)
from calendar
where d < @EndDate
)
select
d,
(select RatePrice
from mgaRate
where d between RateStart and RateEnd
and TypeID = @TypeID)
from calendar
您可以用实际日历替换递归 CTE table。
我有一个 SQL 服务器数据库 table:
并且我正在尝试在某个 TypeID
的特定日期之间获得 RatePrice
,例如
DECLARE @StartDate DATE = '2022-02-26';
DECLARE @EndDate DATE = '2022-03-02';
DECLARE @TypeID int = 10;
DECLARE @RatePrice money;
DECLARE @RateDate DATE;
WHILE (@StartDate <= @EndDate)
BEGIN
SELECT
@RatePrice = RatePrice,
@RateDate = @StartDate
FROM mgaRate
WHERE mgaRate.TypeID = @TypeID
AND ((RateStart BETWEEN @StartDate AND @EndDate) OR
(RateEnd BETWEEN @StartDate AND @EndDate) OR
(RateStart <= @StartDate AND RateEnd >= @EndDate)
)
PRINT @RateDate;
PRINT @RatePrice;
SET @StartDate = DATEADD(day, 1, @StartDate);
END;
但结果不正确:
2022-02-26
400.00
2022-02-27
400.00
2022-02-28
400.00
2022-03-01
400.00
2022-03-02
400.00
二月份的价格应该是 300.00。
您可以使用日历 table 获取所需范围内的所有日期,对于每个日期,您都可以使用原始 table:[=12 中的子查询获取汇率=]
DECLARE @StartDate DATE = '2022-02-26';
DECLARE @EndDate DATE = '2022-03-02';
DECLARE @TypeID int = 10;
with calendar as (
select @StartDate as d
union all
select dateadd(day, 1, d)
from calendar
where d < @EndDate
)
select
d,
(select RatePrice
from mgaRate
where d between RateStart and RateEnd
and TypeID = @TypeID)
from calendar
您可以用实际日历替换递归 CTE table。