Задавайте вопросы, мы ответим
Вы не зашли.
Здравствуйте!
Не получается решить следующую задачу! Из БД извлекаются несколько строк с календарными периодами. Например:
1 строка )с 01.04.2012 по 10.04.2012
2 строка )с 11.04.2012 по 20.04.2012
3 строка )с 25.04.2012 по 30.04.2012
Нужно определить разрыв дней между календарными периодами, т.е. конечной датой 1 строки и начальной датой 2 строки, конечной датой 2 строки и начальной датой 3 строки. И если не в одном промежутке дат кол-во дней не превышает 1-го, тогда сделать то-то.
Я не могу понять, каким способом это можно реализовать.
Отредактированно userbanderas (04.04.2012 13:07:18)
Неактивен
Здравствуйте.
Честно говоря, лучше такое делать на клиентской стороне. Путем страшного костыля возможно получится и на стороне mysql, но не факт. Покажите пожалуйста show create table на Вашу таблицу. И поясните - что значит "сделать то-то". Это означает выполнитть какой-то запрос или?..
Неактивен
Поясню задачу, для более объёмного восприятия!
Администратор сайта создаёт категорию номера гостиницы, в которой устанавливает квоту для разрешения бронирования.Квот может быть несколько! Например:
категория номера: Люкс
квота1 с 10-04-2012 по 15-04-2012 (т.е. бронь разрешается в этом периоде)
квота2 с 16-04-2012 по 20-04-2012 (т.е. бронь разрешается в этом периоде)
квота3 с 25-04-2012 по 30-04-2012 (т.е. бронь разрешается в этом периоде)
Собственно между этими квотами может существовать разрыв дат(например: между квота2 и квота3), который говорит нам что бронирование запрещено в этом разрыве дат.
Я описал это в надежде на то, что возможно найдется другой способ решения этой задачи!
Спасибо заранее!
Неактивен
Т.е. для бронирования, посетитель выбирает дату заезда и отъезда. Если между этими датами попадает разрыв между периодами, которые находятся в БД, то категорию номера не отображать!
Неактивен
Приведите все же структуру таблицы в форме create table t.
Между первой и второй квотой промежуток 0 дней, между второй и третьей 4 дня.
В чем именно состоит задача - получить информацию о том, есть ли промежутки между квотами?
Неактивен
Всё верно, нужно проверить есть ли промежутки между квотами!
Неактивен
-- phpMyAdmin SQL Dump
-- version 3.2.3
-- http://www.phpmyadmin.net
--
-- Хост: localhost
-- Время создания: Апр 04 2012 г., 14:42
-- Версия сервера: 5.1.40
-- Версия PHP: 5.2.12
SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
--
-- База данных: `reservation`
--
-- --------------------------------------------------------
--
-- Структура таблицы `price_season`
--
CREATE TABLE IF NOT EXISTS `price_season` (
`id` int(4) unsigned NOT NULL AUTO_INCREMENT,
`id_hotel_number` int(6) NOT NULL,
`begin_season` date NOT NULL,
`end_season` date NOT NULL,
`price` int(6) NOT NULL,
`quotaNumber` int(3) NOT NULL,
`del` tinyint(1) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=23 ;
Неактивен
Уже понятней. В-общем, тут я вижу два варианта:
1) Определенная денормализация - то есть добавить колонку с названием, допустим, diff_days типа int в таблицу price_season, которая будет хранить количество дней между интервалами (для первой записи будет NULL).
квота1 с 10-04-2012 по 15-04-2012 (т.е. бронь разрешается в этом периоде), NULL
квота2 с 16-04-2012 по 20-04-2012 (т.е. бронь разрешается в этом периоде), 1
квота3 с 25-04-2012 по 30-04-2012 (т.е. бронь разрешается в этом периоде), 5
Тогда в нужных случаях просто делается SELECT max(diff_days) from price_season WHERE begin_season>='...' AND end_season<='...'.
Это создаст определенные сложности при заполнении и изменении данных в этой таблице, но искать будет проще.
2). На клиенте (не знаю, на чем написан Ваш сайт, допустим на php):
Делаете запрос SELECT * FROM price_season WHERE begin_season>='...' AND end_season<='...' order by begin_season
Цикл по всем полученным записями, и начиная со второго элемента:
Отнимаете от даты begin_season i-го элемента end_season i-1-го элемента (http://php.net/manual/ru/book.datetime.php).
Ну и если нашёлся интервал, который больше чем 1 день - то значит есть такие.
Неактивен