Бронирование отелей Цены SQL Проблема - PullRequest
1 голос
/ 28 марта 2011

Привет. Я пытался настроить свою собственную систему проверки стоимости номеров после прочтения других вопросов здесь, в StackOverflow.

Мой запрос работает нормально и выдает правильное количество дней, когда в датах бронирования нет совпадений ставок, но когда это совпадение, я получаю дополнительный день для моей второй строки результатов.

Например, человек приезжает 2011-04-14 и уезжает 2011-04-16 (2 дня).15-го числа скорость меняется с 66 до 70, поэтому у него должно быть 1 день для курса 66 и 1 день для курса 70.

Я пробовал без TIMEDATE - просто DATE, но происходит то же самое.

Запрос

    SELECT rates.rate_id, rate_start_date, rate_end_date, rate_price, 
(DATEDIFF( IF (rate_end_date > '2011-04-16 14:00:00' , '2011-04-16 14:00:00', rate_end_date),
IF ( rate_start_date < '2011-04-14 12:00:00' , '2011-04-14 12:00:00' , rate_start_date )) +1 ) 
AS days FROM rates 
WHERE rate_start_date <= '2011-04-16 14:00:00' AND rate_end_date > '2011-04-14 12:00:00' 
ORDER BY rate_price ASC

таблица ставок

rate_id rate     rate_start_date        rate_end_date
1       70      2011-04-15 00:00:00   2011-05-31 23:59:59
2       80      2011-06-01 00:00:00   2011-06-30 23:59:59
3      100      2011-07-01 00:00:00   2011-08-31 23:59:59
4       80      2011-09-01 00:00:00   2011-09-30 23:59:59
5       70      2011-10-01 00:00:00   2011-10-31 23:59:59
6       45      2011-11-01 00:00:00   2011-12-31 23:59:59
0       66      2011-01-01 00:00:00   2011-04-14 23:59:59

результат

rate_id  rate_start_date         rate_end_date       rate    days
0       2011-01-01 00:00:00    2011-04-14 23:59:59  66  1
1       2011-04-15 00:00:00    2011-05-31 23:59:59  70  2 <----this should be 1 day

Я был бы очень признателен за любую помощь или объяснение, почему мой запрос даетмне дополнительный день второй строки результатов.

Спасибо

Ответы [ 3 ]

0 голосов
/ 28 марта 2011

Если я правильно понимаю ваш алгоритм, вы хотите включить первый день хотя бы частично, поэтому я бы посоветовал вам использовать вместо + 1 для каждого курса делать это только для первого.this (MSSQL):

+ CASE WHEN rate_start_date <= '2011-04-14 12:00:00' THEN 1 ELSE 0 end

или (MYSQL):

+ IF (rate_start_date <= '2011-04-14 12:00:00', 1 ,0)
0 голосов
/ 28 марта 2011

Спасибо за ваши ответы, Мартин, вы произвели 2 строки, но без дней ... Эмилио, ваш ответ заставил меня задуматься о том, как я установил ставки.Я изменил таблицу тарифов на формат даты вместо datetime и сделал rate_end_date в тот же день, что и следующий date_start_date.

0   66  2011-01-01  2011-04-15
1   70  2011-04-15  2011-06-01
2   80  2011-06-01  2011-07-01
3   100 2011-07-01  2011-09-01
4   80  2011-09-01  2011-10-01
5   70  2011-10-01  2011-11-01
6   45  2011-11-01  2012-01-01

, затем сбросил +1 и

SELECT rates.rate_id, rate_start_date, rate_end_date, rate_price, 
(DATEDIFF( IF (rate_end_date > '2011-04-16' , '2011-04-16', rate_end_date), 
IF ( rate_start_date < '2011-04-14' , '2011-04-14' , rate_start_date )) ) 
AS days FROM rates WHERE rate_start_date <= '2011-04-16' 
AND rate_end_date > '2011-04-14' 
ORDER BY rate_price ASC

произвел

rate_id   rate_start_date   rate_end_date   rate  days    
    0   2011-01-01  2011-04-15  66  1
    1   2011-04-15  2011-06-01  70  1

и запрос без перекрывающихся тарифов с 1 по 8 апреля:

SELECT rates.rate_id, rate_start_date, rate_end_date, rate_price, 
(DATEDIFF( IF (rate_end_date > '2011-04-08' , '2011-04-08', rate_end_date), 
IF ( rate_start_date < '2011-04-01' , '2011-04-01' , rate_start_date )) ) 
AS days FROM rates WHERE rate_start_date <= '2011-04-08' 
AND rate_end_date > '2011-04-01' 
ORDER BY rate_price ASC

производит:

rate_id   rate_start_date    rate_end_date   rate  days
    0     2011-01-01       2011-04-15     66    7

спасибо agiain за вашу помощь!

0 голосов
/ 28 марта 2011

Между 2011-04-16 16:00 и 2011-04-15 00:00 есть один день и 16 часов, поэтому ваш DATEDIFF(...)+1 возвращает (правильно) 1 + 1 дней.

Проблема здесь заключается в несоответствии между временем, когда гость прибывает / уходит (около полудня), и временем, когда скорость меняется (в полночь).

Вы должны проверить свои требования, но, возможно, вы можете игнорировать последний неполный день и попросить гостя "уйти" в 2011-04-15 23:59:59 для расчета ставки. Таким же образом, чтобы гость "прибыл" в 2011-04-14 00:00:00. Дополнительные часы в первый день компенсируют недостающие часы в последний день.

...