【问题标题】:calculate price between given dates in multiple ranges计算多个范围内给定日期之间的价格
【发布时间】:2013-04-30 18:15:11
【问题描述】:

您好,以下代码在两个或多个范围内使用时效果很好,但在开始日期和结束日期在同一范围内时效果不佳。当开始日期和结束日期在同一范围内时,totalprice 会返回额外的一天。因此一晚的总价格翻了一番。

这里是mysql表;

CREATE TABLE rooms (
 Hotel_id INT,
 Room_id INT,
 Room_type VARCHAR(20),
 Start_date DATE,
 End_date DATE,
 Price INT
);

INSERT INTO rooms VALUES
(   13   ,     2     ,   'standard' ,  '2012-08-01' ,  '2012-08-15'  , 7000),
(   13   ,     2     ,   'standard' ,  '2012-08-16' ,  '2012-08-31'  , 7500),
(   13   ,     2     ,   'standard' ,  '2012-09-01' ,  '2012-09-30'  , 6000),
(   13   ,     3     ,    'luxury'  ,  '2012-08-01' ,  '2012-08-15'  , 9000),
(   13   ,     3     ,    'luxury'  ,  '2012-08-16' ,  '2012-08-31'  , 10000),
(   13   ,     3     ,    'luxury'  ,  '2012-09-01' ,  '2012-09-30'  , 9500),
(   13   ,     3     ,    'luxury'  ,  '2012-10-01' ,  '2012-10-15'  , 15000);

这里是代码;

SELECT     SUM(
           CASE WHEN a.Start_date = b.min_sd AND a.Start_date <> b.max_sd THEN
                    (DATEDIFF(a.End_date, '2012-09-03')+1) * a.Price
                WHEN a.Start_date = b.max_sd AND a.Start_date <> b.min_sd THEN
                    DATEDIFF('2012-09-04', a.Start_date) * a.Price
                WHEN (a.Start_date,a.Start_date) IN ((b.min_sd,b.max_sd)) THEN
                    (DATEDIFF('2012-09-04', '2012-09-03')+1) * a.Price
                WHEN a.Start_date NOT IN (b.min_sd, b.max_sd)             THEN
                    (DATEDIFF(a.End_date, a.Start_date)+1) * a.Price
           END 
       ) AS totalprice
FROM       rooms a
CROSS JOIN (
       SELECT MIN(Start_date) AS min_sd,
              MAX(Start_date) AS max_sd
       FROM   rooms
       WHERE  Room_type   = 'luxury'     AND
              End_date   >= '2012-09-03' AND
              Start_date <= '2012-09-04'
       ) b
WHERE      a.Room_type   = 'luxury'     AND
       a.End_date   >= '2012-09-03' AND
       a.Start_date <= '2012-09-04';

【问题讨论】:

  • 对查询目标的简要介绍会有所帮助。无论如何,这就是我发现的……第三个WHEN 中的+1 在上述情况下是总数的两倍。因此,也许您需要添加另一个 WHEN 来处理不适合您的场景。例如,当开始日期 > 结束日期时,则不要 +1。

标签: mysql sum date-range


【解决方案1】:

您可以使用这样的查询:

SELECT
  SUM(
    DateDiff(
      Least(End_Date + INTERVAL 1 DAY, '2012-09-04'),
      Greatest(Start_Date, '2012-08-31')
    ) * Price
  )
FROM
  rooms a
WHERE
  a.Room_type   = 'luxury'     AND
  a.End_date   >= '2012-08-31' AND
  a.Start_date <  '2012-09-04';

请看小提琴here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-19
    相关资源
    最近更新 更多