首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >查询:根据日期计算平均住宿价格

查询:根据日期计算平均住宿价格
EN

Stack Overflow用户
提问于 2011-05-13 20:02:47
回答 1查看 850关注 0票数 4

大家好,

我需要为房屋搜索创建一个查询,这将匹配数据库用户输入的数据:他们想搬进和离开的日期,他们在组中的人数和每晚的价格。

让我们说,用户搜索房屋:

日期:从2011-01-15到2011-03-01 (见图片周期A1C1),供3人使用,他愿意每晚花费90至125美元。

--这是我对这个搜索的手工计算:

数据库中提供的

  • 日期用户希望停留的日期总数为: 2011-01-15至2011-01-25是10天* $100 = 1000美元
  • 第二阶段价格为20天* $120 =$ 2400

H 112H 112价格为14天*140美元= 1960美元H 213H 114每晚总平均价格=1000+2400+1960/ 44 =121美元。8

  • 价格和人数与用户输入相匹配,所以我们展示了这个房子

如果您合并日期并计算给定期间的每晚平均价格,搜索脚本应该与上面提供的数据数组相匹配。

我的问题是:,如果用户数据与数据库中的记录匹配,我的查询应该如何快速计算。

我在考虑使用SQL DATEDIFF函数,然后按价格乘以.等等,但在我看来很复杂。

如有任何建议,我将不胜感激。

谢谢

更新

以下是我的数据库模式:

表"apt_search_periods“,存储所有合并日期(可用性表中的连续日期)

代码语言:javascript
复制
+-----------+------------+------------+-----------+--------------+--------+
| period_id | start_date | end_date   | rental_id | nb_of_people | merged |
+-----------+------------+------------+-----------+--------------+--------+
|        21 | 2011-03-31 | 2012-03-31 |       548 |            4 | y      |
+-----------+------------+------------+-----------+--------------+--------+

表"apt_search_periods_avail“将合并日期与可用性表链接

代码语言:javascript
复制
+----+-----------+-----------------+
| id | period_id | availability_id |
+----+-----------+-----------------+
| 21 |        21 |           20953 |
| 22 |        21 |           20952 |
| 23 |        21 |            4033 |
+----+-----------+-----------------+

表“可用性”,并附有扩大的日期和价格

代码语言:javascript
复制
+-------+-----------+------------+------------+--------------+--------------+
| id    | rental_id | start_date | end_date   | nb_of_people | rent_per_day |
+-------+-----------+------------+------------+--------------+--------------+
| 20952 |       548 | 2011-03-31 | 2011-07-01 |            4 |          575 |
|  4033 |       548 | 2011-07-01 | 2011-09-01 |            4 |          680 |
| 20953 |       548 | 2011-09-01 | 2012-03-31 |            4 |          575 |
+-------+-----------+------------+------------+--------------+--------------+
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-05-13 20:50:42

跟随会让你开始。

请注意,唯一的区别是,根据DATEDIFF,第三个周期包含15天io 14。

SQL语句

代码语言:javascript
复制
;WITH q AS (
  /* Kick of with the record where startdate < input < enddate */
  SELECT  date_start
          , date_end
  FROM    @HouseSearch
  WHERE   date_start <= @date_start
          AND date_end >= @date_start
          AND nb_people >= @nb_people -- Only when number of people is adequate
  UNION ALL
  SELECT  q.date_start
          , hs.date_end
  FROM    q
          INNER JOIN @HouseSearch hs ON hs.date_start = q.date_end
  WHERE   nb_people >= @nb_people -- Only when number of people is adequate
)
SELECT  *
FROM    (
          -- Only return result if sequence exists between date range
          SELECT  date_start = MIN(date_start)
                  , date_end = MAX(date_end)
          FROM    q
          WHERE   date_end >= @date_end 
        ) datetimerange
        -- Calculate the average price
        CROSS APPLY (
          SELECT  [AveragePrice] = SUM(price / DATEDIFF(dd, @date_start, @date_end))
          FROM    (
                    -- Price for all records where date_end <= @date_end 
                    SELECT  [price] = 
                              CASE WHEN @date_start < date_start 
                              THEN DATEDIFF(dd, date_start, date_end) * price
                              ELSE DATEDIFF(dd, @date_start, date_end) * price
                              END                        
                    FROM    @HouseSearch        
                    WHERE   @date_end > date_end
                    UNION ALL
                    -- Price of remaining records where date_end >= @date_end
                    SELECT  DATEDIFF(dd, date_start, @date_end) * price
                    FROM    @HouseSearch        
                    WHERE   @date_end between date_start AND date_end
                  ) prices
        ) price                  
WHERE   date_start IS NOT NULL            

测试数据

代码语言:javascript
复制
DECLARE @HouseSearch TABLE (
  date_start DATE
  , date_end DATE
  , nb_people INTEGER
  , price FLOAT
)  

INSERT INTO @HouseSearch VALUES
  ('2011-01-01', '2011-01-25', 4, 100)
  , ('2011-01-25', '2011-02-14', 3, 120)
  , ('2011-02-14', '2011-03-12', 3, 140)
  , ('2011-03-12', '2011-04-10', 3, 100)

DECLARE @date_start DATE = '2011-01-15'
DECLARE @date_end DATE = '2011-03-01'
DECLARE @nb_people INTEGER = 3
DECLARE @price_low FLOAT = 90
DECLARE @price_high FLOAT = 15
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5997160

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档