2012-08-04 2 views
1
 
Hotel_id Room_id Room_type Start_date End_date  Price 
---------------------------------------------------------------- 
    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 

안녕하세요 이것은 내 테이블의 구조와 데이터입니다.주어진 날짜 사이의 가격 계산

  1. 날짜가 체크인 할 때 체크 아웃
  2. 객실 타입

경우 :

나는 MySQL 데이터베이스 사용자가 입력 한 데이터에 일치합니다 호텔 예약에 대한 쿼리를 작성해야 예 :

사용자가이 날짜 (2012-08-30부터 2012-09-04)까지 고급 객실이있는 호텔을 선택하면 총 비용은 (10000 * 2) 9 월 1 일, 2 월 3 일 및 3 월 9 일 (9500 * 3)은 총 금액이 20000 + 28500 = 48500이됩니다.

그래서 쿼리는 Hotel_id, Room_id, START_DATE, END_DATE 및 가격에

감사

+1

에 오신 것을 환영합니다. 귀하의 질문은 무엇인가? –

+0

죄송합니다. 그러나이 질문은 주어진 질문과 정확히 일치하지 않습니다. 질문에이 질문에는 모든 날짜에 대한 항목이 있지만이 질문에는 각 날짜 범위에 대해서만 기록이 있습니다. 나는이 질문이 재개되도록 투표하고있다. – eggyal

+0

SELECT a.price, DATEDIFF ('2012-09-01', '2012-08-29') 평일 AS 호텔에서 a a.room_id = 3 AND '2012-09-01'start_date와 end_date 사이 나는 이것을 시도했지만 작동하지 않습니다. –

답변

3

사용이 솔루션 :

SELECT  SUM(
       CASE WHEN a.Start_date = b.min_sd AND a.Start_date <> b.max_sd THEN 
         (DATEDIFF(a.End_date, '2012-08-30')+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-08-30')+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-08-30' AND 
        Start_date <= '2012-09-04' 
      ) b 
WHERE  a.Room_type = 'luxury'  AND 
      a.End_date >= '2012-08-30' AND 
      a.Start_date <= '2012-09-04' 

은 각각 사용자의 입력 시작과 끝 날짜와 2012-08-302012-09-04의 차례 나오는 교체합니다.

시작일과 종료일이 같은 달에 포함되며 여러 달에 걸쳐 적용됩니다. 스택 오버플로


SQLFiddle Demo

+0

주어진 날짜가 날짜 데이터베이스와 다른 경우 가격을 계산하는 방법은 무엇입니까? –

0

이 시도 :

set @Hotel_id :=13; 
set @Room_id :=3; 
set @Start_date :='2012-08-30' ; 
set @End_date :='2012-09-04'; 

select sum(b.TotalPrice-b.deductions) as total_cost from 
(select a.Price,a.StartDate,a.EndDate,price*(DATEDIFF(a.EndDate,a.StartDate)+1) as TotalPrice 
,case when [email protected]_date then a.Price else 0 end as deductions 
from 
(select price,case when @Start_date>=Start_date then @Start_date else Start_date end as StartDate 
,case when @End_date<=End_date then @End_date else End_date end as EndDate 
from h_booking h1 
where [email protected]_id 
and [email protected]_id 
and (@Start_date between Start_date and End_date or @End_date between Start_date and End_date))a)b 
+0

감사합니다. –

+0

감사합니다. 귀하의 질문에 완벽한 답변을 얻었습니다. 좋은 일을 계속 지켜라. –

2
당신이 원하는 예약이 떨어지는에서 날짜 범위를 찾기 위해 MySQL을의 BETWEEN ... AND ... 연산자를 사용할 수 있습니다

(재 회원이 주어진 체크 아웃에서 하루를 내고 날짜를 말하고, 그날 밤 숙박이없는 경우) 방을 기준으로 결과를 그룹화하고 가격 시간대 밤에 SUM() ( 은 LEAST()GREATEST() 기능) :

SELECT Room_id, 
     SUM(Price * (1 + DATEDIFF(
       LEAST(End_date, '2012-09-04' - INTERVAL 1 DAY), 
      GREATEST(Start_date, '2012-08-30') 
     ))) AS Total 
FROM  mytable 
WHERE Room_type = 'luxury' AND (
       '2012-09-04' - INTERVAL 1 DAY 
          BETWEEN Start_date AND End_date 
      OR '2012-08-30' BETWEEN Start_date AND End_date 
     ) 
GROUP BY Room_id 

sqlfidde에를 참조하십시오.