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。

Fiddle