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';
我想你可以将你的查询修改成这样:
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
.
分组
如果一个人在 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';
我想你可以将你的查询修改成这样:
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
.