Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Перекрытие двух диапазонов дат.
 
 автор: reimax   (08.12.2011 в 19:17)   письмо автору
 
 

Здравствуйте,

У меня есть некая форма, в которой пользователь задаёт дату начала и окончания события. В бд хранится для этого события свои наборы дат и соответствующие к ним цены на каждый день.

Пример, пусть изначально у меня храниться в бд такие данные: с 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 рублей?

  Ответить  
 
 автор: Valick   (08.12.2011 в 19:25)   письмо автору
 
   для: reimax   (08.12.2011 в 19:17)
 

структуру таблицы давайте

  Ответить  
 
 автор: reimax   (08.12.2011 в 20:34)   письмо автору
 
   для: 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 ;

  Ответить  
 
 автор: Valick   (08.12.2011 в 20:47)   письмо автору
 
   для: reimax   (08.12.2011 в 20:34)
 

почему у вас дата тип поля varchar?
что нужно найти? среднее арифметическое?

  Ответить  
 
 автор: reimax   (08.12.2011 в 20:49)   письмо автору
 
   для: Valick   (08.12.2011 в 20:47)
 

я пример привел, мне сумма нужна из значений, которые зависят от того, в какой в данному случае из диапазонов попадает выбранная дата. Часть суммы нужно посчитать по 100 рублей, часть по 150...

  Ответить  
 
 автор: Valick   (09.12.2011 в 11:31)   письмо автору
 
   для: reimax   (08.12.2011 в 20:49)
 

хорошо, надо подумать

  Ответить  
 
 автор: reimax   (09.12.2011 в 12:08)   письмо автору
 
   для: 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   (09.12.2011 в 20:59)   письмо автору
 
   для: 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
)


Вопрос такой, как мне в первый массив получить значения второго?

  Ответить  
 
 автор: Valick   (10.12.2011 в 01:26)   письмо автору
 
   для: reimax   (09.12.2011 в 20:59)
 

может проще хранить цену на каждый день?
это всего-лишь 365 строк в год

  Ответить  
 
 автор: reimax   (10.12.2011 в 01:57)   письмо автору
 
   для: Valick   (10.12.2011 в 01:26)
 

у проекта есть некоторые особенности, и нет возможности так хранить цены...

  Ответить  
 
 автор: Valick   (10.12.2011 в 09:58)   письмо автору
 
   для: reimax   (10.12.2011 в 01:57)
 

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

  Ответить  
 
 автор: reimax   (10.12.2011 в 12:10)   письмо автору
 
   для: 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 можно строчек, только их в реале будет в разы больше.

  Ответить  
 
 автор: Valick   (10.12.2011 в 14:48)   письмо автору
 
   для: reimax   (10.12.2011 в 12:10)
 

даже если их будет в 100 раз больше это мизер для БД
что значит диапазоны перекрываются? в один день могут быть две и более цены? тогда где логика?
но даже в таком случае предложенный мной вариант будет лучше, просто нужно чуть дополнить таблицу
и я так и не услышал объяснения почему тип поля для хранения даты varchar, а не date?
судя по коду вы все возможности БД сводите к нулю, используя её тупо для хранения данных
___
поверьте я задаю так много вопросов, потому что хочу вам помочь, а не потому что мне совсем совсем нехрен делать.

  Ответить  
 
 автор: reimax   (10.12.2011 в 22:24)   письмо автору
 
   для: Valick   (10.12.2011 в 14:48)
 

дата храниться в формате 22-11-2011 поля типа int не подходит. а какой может быть ваш вариант, что предлагаете? может я не правильно понимаю что то...

  Ответить  
 
 автор: reimax   (10.12.2011 в 23:32)   письмо автору
 
   для: Valick   (10.12.2011 в 14:48)
 

как где? В один день 3 спектакля, значит 3 цены. События могут друг друга перекрывать легко.

  Ответить  
 
 автор: Valick   (11.12.2011 в 00:17)   письмо автору
 
   для: reimax   (10.12.2011 в 23:32)
 

В один день 3 спектакля
ну наконец-то :) о таких вещах пишите сразу
теперь еще объясните зачем складывать цену
чтобы окончательно все стало на свои места

  Ответить  
 
 автор: reimax   (11.12.2011 в 00:42)   письмо автору
 
   для: Valick   (11.12.2011 в 00:17)
 

считается сумма за три спектакля, а не всегда, потом скидка от него.

  Ответить  
 
 автор: reimax   (11.12.2011 в 13:57)   письмо автору
 
   для: reimax   (11.12.2011 в 00:42)
 

вопрос решился просто:


$final=array();
                    foreach($get as $key=>$value)
                    {
                        $final[$key]=$flash[$key];
                    }
                    $sum = array_sum($final);

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования