|
|
|
| Здравствуйте,
У меня есть некая форма, в которой пользователь задаёт дату начала и окончания события. В бд хранится для этого события свои наборы дат и соответствующие к ним цены на каждый день.
Пример, пусть изначально у меня храниться в бд такие данные: с 10.11.2011 и по 25.11.2011 года цена 100 рублей. С 26.11.2011 и по 30.11.2011 года 150 рублей. Если пользователь задаёт диапазон с 23.11.2011 по 29,11,2011, как правильно посчитать каждый день с 23.11.2011 года по 25.11.2011 по цене 100 рублей, а оставшееся время по 150 рублей? | |
|
|
|
|
|
|
|
для: reimax
(08.12.2011 в 19:17)
| | структуру таблицы давайте | |
|
|
|
|
|
|
|
для: Valick
(08.12.2011 в 19:25)
| | Таблицы? Вот:
CREATE TABLE IF NOT EXISTS `modul_datepicker` (
`id` mediumint(5) unsigned NOT NULL AUTO_INCREMENT,
`research_id` int(10) unsigned NOT NULL DEFAULT '0',
`research_datepicker_start` varchar(250) NOT NULL,
`research_datepicker_end` varchar(250) NOT NULL,
`research_datepicker_price` int(10) unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=19 ;
|
| |
|
|
|
|
|
|
|
для: reimax
(08.12.2011 в 20:34)
| | почему у вас дата тип поля varchar?
что нужно найти? среднее арифметическое? | |
|
|
|
|
|
|
|
для: Valick
(08.12.2011 в 20:47)
| | я пример привел, мне сумма нужна из значений, которые зависят от того, в какой в данному случае из диапазонов попадает выбранная дата. Часть суммы нужно посчитать по 100 рублей, часть по 150... | |
|
|
|
|
|
|
|
для: reimax
(08.12.2011 в 20:49)
| | хорошо, надо подумать | |
|
|
|
|
|
|
|
для: Valick
(09.12.2011 в 11:31)
| | Если честно, я даже не представляю примерного алгоритма как можно сделать. Как вариант, выбрать из бд все даты, собрать массив вида
array(10.11.2011 => 100, 11.11.2011 => 100, 12.11.2011 => 100, .... 20.11.2011 => 150, 11.11.2011 => 150). После чего перебираем все его элементы, сравниваем даты, при совпадении записываем число. Но, я получаю просто тьму циклов. Может более опытные люди подскажут решение? | |
|
|
|
|
|
|
|
для: reimax
(08.12.2011 в 19:17)
| | Нашел вариант решения проблемы. Сейчас есть два таких массива:
Array
(
[07.12.2011] =>
[08.12.2011] =>
[09.12.2011] =>
[10.12.2011] =>
[11.12.2011] =>
[12.12.2011] =>
[13.12.2011] =>
[14.12.2011] =>
[15.12.2011] =>
[16.12.2011] =>
[17.12.2011] =>
[18.12.2011] =>
[19.12.2011] =>
[20.12.2011] =>
[21.12.2011] =>
[22.12.2011] =>
[23.12.2011] =>
)
|
Array
(
[18.12.2011] => 441421
[19.12.2011] => 441421
[20.12.2011] => 441421
[21.12.2011] => 441421
[22.12.2011] => 441421
[02.12.2011] => 5000
[03.12.2011] => 5000
[04.12.2011] => 5000
[05.12.2011] => 5000
[06.12.2011] => 5000
[07.12.2011] => 5000
[08.12.2011] => 5000
[09.12.2011] => 5000
[10.12.2011] => 5000
[11.12.2011] => 5000
[12.12.2011] => 5000
[13.12.2011] => 5000
[14.12.2011] => 5000
[15.12.2011] => 5000
[16.12.2011] => 5000
)
|
Вопрос такой, как мне в первый массив получить значения второго? | |
|
|
|
|
|
|
|
для: reimax
(09.12.2011 в 20:59)
| | может проще хранить цену на каждый день?
это всего-лишь 365 строк в год | |
|
|
|
|
|
|
|
для: Valick
(10.12.2011 в 01:26)
| | у проекта есть некоторые особенности, и нет возможности так хранить цены... | |
|
|
|
|
|
|
|
для: reimax
(10.12.2011 в 01:57)
| | ну и расскажите про эти особенности
а так же покажите запрос при помощи которого вы получаете свой массив
__
у меня пока теоретически задача решается тремя запросами, на практике еще не реализовал, но уже видно что геморрой, а вот при хранении цена - день все легко, включая и получение диапазонов дат. | |
|
|
|
|
|
|
|
для: Valick
(10.12.2011 в 09:58)
| | не запрос, функция:
$timer = array();
$sql = $DB->Query(" SELECT * FROM datepicker WHERE datepicker_id = '".$getdoc."' ");
while ($temp = $sql->fetchrow()) {
// преобразование даты
$date_elements = split("-", $temp->research_datepicker_start);
$run1 = mktime(0,0,0,$date_elements[1],$date_elements[2],$date_elements[0]);
$date_elements = split("-", $temp->research_datepicker_end);
$run2 = mktime(0,0,0,$date_elements[1],$date_elements[2],$date_elements[0]);
$temp->int = array();
for($i=$run1; $i<$run2; $i += 86400) {
$key = date("d.m.Y", $i);
$temp->int += array($key => $temp->research_datepicker_price);
}
array_push($timer, $temp);
}
// введённые данные
$date_elements = split("-", $_REQUEST['from']);
$run1 = mktime(0,0,0,$date_elements[1],$date_elements[2],$date_elements[0]);
$date_elements = split("-", $_REQUEST['to']);
$run2 = mktime(0,0,0,$date_elements[1],$date_elements[2],$date_elements[0]);
$get = array();
for($i=$run1; $i<$run2; $i += 86400) {
$key = date("d.m.Y", $i);
$get += array($key => "");
}
// поиск цены
$flash = array();
for($i=0; $i<count($timer); $i++) {
$flash += $timer[$i]->int;
}
$result = array_diff($flash, $get);
$sum = array_sum($result);
print_r("<pre>");
print_r($result);
print_r("</pre>");
|
даты событий могут перекрываться, задавать их нужно диапазонами, разворачивать 365 можно строчек, только их в реале будет в разы больше. | |
|
|
|
|
|
|
|
для: reimax
(10.12.2011 в 12:10)
| | даже если их будет в 100 раз больше это мизер для БД
что значит диапазоны перекрываются? в один день могут быть две и более цены? тогда где логика?
но даже в таком случае предложенный мной вариант будет лучше, просто нужно чуть дополнить таблицу
и я так и не услышал объяснения почему тип поля для хранения даты varchar, а не date?
судя по коду вы все возможности БД сводите к нулю, используя её тупо для хранения данных
___
поверьте я задаю так много вопросов, потому что хочу вам помочь, а не потому что мне совсем совсем нехрен делать. | |
|
|
|
|
|
|
|
для: Valick
(10.12.2011 в 14:48)
| | дата храниться в формате 22-11-2011 поля типа int не подходит. а какой может быть ваш вариант, что предлагаете? может я не правильно понимаю что то... | |
|
|
|
|
|
|
|
для: Valick
(10.12.2011 в 14:48)
| | как где? В один день 3 спектакля, значит 3 цены. События могут друг друга перекрывать легко. | |
|
|
|
|
|
|
|
для: reimax
(10.12.2011 в 23:32)
| | В один день 3 спектакля
ну наконец-то :) о таких вещах пишите сразу
теперь еще объясните зачем складывать цену
чтобы окончательно все стало на свои места | |
|
|
|
|
|
|
|
для: Valick
(11.12.2011 в 00:17)
| | считается сумма за три спектакля, а не всегда, потом скидка от него. | |
|
|
|
|
|
|
|
для: reimax
(11.12.2011 в 00:42)
| | вопрос решился просто:
$final=array();
foreach($get as $key=>$value)
{
$final[$key]=$flash[$key];
}
$sum = array_sum($final);
|
| |
|
|
|