mysql SELECT DATEDIFF 来自费率范围并获取价格

mysql SELECT DATEDIFF from rate ranges and get price

如果一个人在 2/3/22 入住并在 2/6/2022 退房,我正在尝试获取总费率。有些天属于不同​​的费率范围,您会在下面看到我能够获得每个范围内的天数,但我需要总价。任何帮助都会很棒。 例如 267+267+281 = 815

数据

Unit fromdate todate day
motel5 2022-01-10 2022-02-04 281
motel5 2022-02-05 2022-03-04 267

查询

SELECT unit, fromdate, todate, day, 
(DATEDIFF( IF (todate > '2022-02-06' , '2022-02-06', todate), 
IF ( fromdate < '2022-02-02' , '2022-02-02' , fromdate )) ) 
AS days FROM rates_new WHERE fromdate <= '2022-02-06' 
AND todate > '2022-02-02' AND Unit = 'motel5'
ORDER BY days ASC

结果

Unit fromdate todate day days
motel5 2022-01-10 2022-02-04 281 2
motel5 2022-02-05 2022-03-25 267 1

您可以使用 least()greatest() 来获取范围或访问的结束日期之间的范围内的有效边界。使用 datediff() 获得天数差异,乘以价格并使用 sum() 聚合以获得访问的总价格。

SELECT sum(datediff(least(adddate('2022-02-06',
                                  INTERVAL 1 DAY),
                          todate),
                    greatest('2022-02-03',
                             fromdate))
           * day)
       FROM rates_new
       WHERE unit = 'motel5'
             AND fromdate <= '2022-02-06'
             AND todate >= '2022-02-03';

db<>fiddle

我想你可以将你的查询修改成这样:

SET @mindt := '2022-02-02';
SET @maxdt := '2022-02-06';

SELECT unit,
       SUM(days*day)
       FROM
(SELECT unit, fromdate, todate, day,
        DATEDIFF(IF(todate > @maxdt, @maxdt, todate), 
                  IF(fromdate < @mindt, @mindt, fromdate)) AS days
  FROM rates_new 
  WHERE fromdate <= '2022-02-06' 
  AND todate > '2022-02-02') V
GROUP BY unit;

不要在查询中定义日期,而是尝试使用变量,这样您只需更改变量的日期值并将变量相应地放入查询中。然后去掉这个条件:

AND Unit = 'motel5'

并将查询转换为子查询。从那里你可以计算 SUM(days*day) 然后按 unit.

分组

Updated fiddle