За последние 24 часа нас посетил 15081 программист и 1655 роботов. Сейчас ищет 881 программист ...

Как сделать выборку по датам?

Тема в разделе "MySQL", создана пользователем skorpion, 4 дек 2014.

  1. skorpion

    skorpion Активный пользователь

    С нами с:
    6 фев 2011
    Сообщения:
    56
    Симпатии:
    1
    Адрес:
    Москва
    Всем привет!
    Необходимо добавить в выборку из одной таблицы ограничение по датам.
    Мол вывести значения начиная с "12 ноября 2014 по 12 декабря 2014".
    Вот как в вот этот запрос:
    Код (PHP):
    1.     $sql = mysql_query("SELECT * FROM `baza_orderov` WHERE `order_id` >= $limit ORDER BY `order_id` $sort_by", $link);
    2.     while ($result = mysql_fetch_array($sql)) {
    3.     /*тут выводим полученные результаты*/
    4.     }
    добавить возможность выборки по датам чтоб получилось так:

    Код (Text):
    1. <form name="dataorderov">
    2.     Начало&nbsp;
    3.     <select name="start_date">
    4.     <option selected value="01">01</option>
    5.     <option value="02">02</option>
    6.     <option value="03">03</option>
    7.     <option value="04">04</option>
    8.     <option value="05">05</option>
    9.     <option value="06">06</option>
    10.     <option value="07">07</option>
    11.     <option value="08">08</option>
    12.     <option value="09">09</option>
    13.     <option value="10">10</option>
    14.     <option value="11">11</option>
    15.     <option value="12">12</option>
    16.     <option value="13">13</option>
    17.     <option value="14">14</option>
    18.     <option value="15">15</option>
    19.     <option value="16">16</option>
    20.     <option value="17">17</option>
    21.     <option value="18">18</option>
    22.     <option value="19">19</option>
    23.     <option value="20">20</option>
    24.     <option value="21">21</option>
    25.     <option value="22">22</option>
    26.     <option value="23">23</option>
    27.     <option value="24">24</option>
    28.     <option value="25">25</option>
    29.     <option value="26">26</option>
    30.     <option value="27">27</option>
    31.     <option value="28">28</option>
    32.     <option value="29">29</option>
    33.     <option value="30">30</option>
    34.     <option value="31">31</option>
    35.     </select>
    36.     <select name="start_month" size="1">
    37.     <option value="01">Январь</option>
    38.     <option value="02">Февраль</option>
    39.     <option value="03">Март</option>
    40.     <option value="04">Апрель</option>
    41.     <option value="05">Май</option>
    42.     <option value="06">Июнь</option>
    43.     <option value="07">Июль</option>
    44.     <option value="08">Август</option>
    45.     <option value="09">Сентябрь</option>
    46.     <option value="10">Октябрь</option>
    47.     <option value="11">Ноябрь</option>
    48.     <option value="12">Декабрь</option>
    49.     </select>
    50.     <select name="start_year" size="1">
    51.     <option value="2009">2009</option>
    52.     <option value="2010">2010</option>
    53.     <option value="2011">2011</option>
    54.     <option value="2012">2012</option>
    55.     <option value="2013">2013</option>
    56.     <option value="2014" selected>2014</option>
    57.     <option value="2015">2015</option>
    58.     <option value="2016">2016</option>
    59.     </select>
    60.    
    61.     Конец&nbsp;
    62.     <select name="end_date">
    63.     <option selected value="01">01</option>
    64.     <option value="02">02</option>
    65.     <option value="03">03</option>
    66.     <option value="04">04</option>
    67.     <option value="05">05</option>
    68.     <option value="06">06</option>
    69.     <option value="07">07</option>
    70.     <option value="08">08</option>
    71.     <option value="09">09</option>
    72.     <option value="10">10</option>
    73.     <option value="11">11</option>
    74.     <option value="12">12</option>
    75.     <option value="13">13</option>
    76.     <option value="14">14</option>
    77.     <option value="15">15</option>
    78.     <option value="16">16</option>
    79.     <option value="17">17</option>
    80.     <option value="18">18</option>
    81.     <option value="19">19</option>
    82.     <option value="20">20</option>
    83.     <option value="21">21</option>
    84.     <option value="22">22</option>
    85.     <option value="23">23</option>
    86.     <option value="24">24</option>
    87.     <option value="25">25</option>
    88.     <option value="26">26</option>
    89.     <option value="27">27</option>
    90.     <option value="28">28</option>
    91.     <option value="29">29</option>
    92.     <option value="30">30</option>
    93.     <option value="31">31</option>
    94.     </select>
    95.     <select name="end_month" size="1">
    96.     <option value="01">Январь</option>
    97.     <option value="02">Февраль</option>
    98.     <option value="03">Март</option>
    99.     <option value="04">Апрель</option>
    100.     <option value="05">Май</option>
    101.     <option value="06">Июнь</option>
    102.     <option value="07">Июль</option>
    103.     <option value="08">Август</option>
    104.     <option value="09">Сентябрь</option>
    105.     <option value="10">Октябрь</option>
    106.     <option value="11">Ноябрь</option>
    107.     <option value="12">Декабрь</option>
    108.     </select>
    109.     <select name="end_year" size="1">
    110.     <option value="2009">2009</option>
    111.     <option value="2010">2010</option>
    112.     <option value="2011">2011</option>
    113.     <option value="2012">2012</option>
    114.     <option value="2013">2013</option>
    115.     <option value="2014" selected>2014</option>
    116.     <option value="2015">2015</option>
    117.     <option value="2016">2016</option>
    118.     </select>
    119. </form>
    Таблица "timestamp" содержит даты в секундах "1362978411"
     
  2. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    непонятно. это имя таблицы? покажи всю таблицу — в формате create table
     
  3. skorpion

    skorpion Активный пользователь

    С нами с:
    6 фев 2011
    Сообщения:
    56
    Симпатии:
    1
    Адрес:
    Москва
    я не знаю как вывести таблицу в формате create table
    Это подойдёт?
    [​IMG]
     
  4. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    для даты и времени есть свои типы
    create table можно сделать выполнив запрос show create table во вкладке sql или сделать экспорт "на экран"+ "только структура" на вкладке экспорта.
    кстати пма у вас вроде сильно устаревшая.
     
  5. skorpion

    skorpion Активный пользователь

    С нами с:
    6 фев 2011
    Сообщения:
    56
    Симпатии:
    1
    Адрес:
    Москва
    Код (Text):
    1.  
    2. CREATE TABLE `baza_orderov` (  `order_id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,  `is_parent_order` char(1) NOT NULL DEFAULT 'N',  `parent_order_id` mediumint(8) unsigned NOT NULL DEFAULT '0',  `company_id` int(11) unsigned NOT NULL DEFAULT '0',  `user_id` mediumint(8) unsigned NOT NULL DEFAULT '0',  `total` decimal(12,2) NOT NULL DEFAULT '0.00',  `subtotal` decimal(12,2) NOT NULL DEFAULT '0.00',  `discount` decimal(12,2) NOT NULL DEFAULT '0.00',  `subtotal_discount` decimal(12,2) NOT NULL DEFAULT '0.00',  `payment_surcharge` decimal(12,2) NOT NULL DEFAULT '0.00',  `shipping_ids` varchar(255) NOT NULL DEFAULT '',  `shipping_cost` decimal(12,2) NOT NULL DEFAULT '0.00',  `shipment_date` date DEFAULT NULL,  `timestamp` int(11) unsigned NOT NULL DEFAULT '0',  `status` char(1) NOT NULL DEFAULT 'O',  `notes` text NOT NULL,  `details` text NOT NULL,  `promotions` text NOT NULL,  `promotion_ids` varchar(255) NOT NULL DEFAULT '',  `title` varchar(32) NOT NULL DEFAULT '',  `firstname` varchar(32) NOT NULL DEFAULT '',  `lastname` varchar(32) NOT NULL DEFAULT '',  `company` varchar(255) NOT NULL DEFAULT '',  `b_title` varchar(32) NOT NULL DEFAULT '',  `b_firstname` varchar(128) NOT NULL DEFAULT '',  `b_lastname` varchar(128) NOT NULL DEFAULT '',  `b_address` varchar(255) NOT NULL DEFAULT '',  `b_address_2` varchar(255) NOT NULL DEFAULT '',  `b_city` varchar(64) NOT NULL DEFAULT '',  `b_county` varchar(32) NOT NULL DEFAULT '',  `b_state` varchar(32) NOT NULL DEFAULT '',  `b_country` char(2) NOT NULL DEFAULT '',  `b_zipcode` varchar(32) NOT NULL DEFAULT '',  `b_phone` varchar(32) NOT NULL DEFAULT '',  `s_title` varchar(32) NOT NULL DEFAULT '',  `s_firstname` varchar(128) NOT NULL DEFAULT '',  `s_lastname` varchar(128) NOT NULL DEFAULT '',  `s_address` varchar(255) NOT NULL DEFAULT '',  `s_address_2` varchar(255) NOT NULL DEFAULT '',  `s_city` varchar(64) NOT NULL DEFAULT '',  `s_county` varchar(32) NOT NULL DEFAULT '',  `s_state` varchar(32) NOT NULL DEFAULT '',  `s_country` char(2) NOT NULL DEFAULT '',  `s_zipcode` varchar(32) NOT NULL DEFAULT '',  `s_phone` varchar(32) NOT NULL DEFAULT '',  `s_address_type` varchar(32) NOT NULL DEFAULT '',  `phone` varchar(32) NOT NULL DEFAULT '',  `fax` varchar(32) NOT NULL DEFAULT '',  `url` varchar(32) NOT NULL DEFAULT '',  `email` varchar(128) NOT NULL DEFAULT '',  `payment_id` mediumint(8) NOT NULL DEFAULT '0',  `tax_exempt` char(1) NOT NULL DEFAULT 'N',  `lang_code` char(2) NOT NULL DEFAULT 'EN',  `ip_address` varchar(15) NOT NULL DEFAULT '',  `repaid` int(11) NOT NULL DEFAULT '0',  `validation_code` varchar(20) NOT NULL DEFAULT '',  `localization_id` mediumint(8) NOT NULL,  `is_return` tinyint(4) NOT NULL DEFAULT '0',  `driver_name` varchar(128) DEFAULT '',  `driver_phone` varchar(128) DEFAULT '',  `lift_to_floor` decimal(12,2) NOT NULL DEFAULT '0.00',  `s_manager` varchar(50) NOT NULL,  `username` varchar(255) NOT NULL,  PRIMARY KEY (`order_id`),  KEY `timestamp` (`timestamp`),  KEY `user_id` (`user_id`),  KEY `promotion_ids` (`promotion_ids`),  KEY `status` (`status`),  KEY `shipping_ids` (`shipping_ids`),  KEY `is_return` (`is_return`)) ENGINE=MyISAM AUTO_INCREMENT=10144 DEFAULT CHARSET=utf8

    а дату получаю вот так:

    Код (PHP):
    1. $data_zakaza = date("d.m.Y H:i:s",$result['timestamp']); 
     
  6. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    ну тут либо значения фильтра приводить в такие же таймстампы и делать сравнение чисел в диапазоне, либо приводить дату к правильному типу и тогда можно будет явно указывать типа 2011-02-06 - 2014-12-04. вам как удобнее? постоянно туда-сюда дату гонять через таймстамп или хранить данные в подходящем стиле? да, дата не 4 байта как инт(11) а 8 будет занимать, но с ней ведь работать удобнее. и она не зависит от юникс эпохи. и часовые пояса мускул корректно понимает. и она человекочитаема в отличии от таймстампа.
     
  7. skorpion

    skorpion Активный пользователь

    С нами с:
    6 фев 2011
    Сообщения:
    56
    Симпатии:
    1
    Адрес:
    Москва
    Нужно перегонять... Там очень много на этом завязано... Вплоть до выгрузки в 1С... по этому трогать лучше не буду и оставлю всё как есть и лучше дату скриптом перегнать в нужный скрипту формат, как я и делал.

    Можешь помочь добавить выборку по диапазону даты в этот код?
     
  8. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    skorpion, понятно. смутило имя, т.к. в MySQL есть тип TIMESTAMP.
    "правильные" типы для даты в майсиквеле это DATE, DATETIME и TIMESTAMP.

    ну ок, если поле целочисленное, значит фильтр ты можешь задавать как-то так:
    Код (PHP):
    1. mysql_query("SELECT блаблабла 
    2. FROM `baza_orderov` AS bo
    3. WHERE bo.`timestamp` BETWEEN {$d1} AND {$d2}"); 
    здесь $d1 и $d2 содержат целые числа. например такие:
    Код (PHP):
    1. $d1 = strtotime('yesterday');
    2. $d2 = strtotime('today') - 1; // т.к. условие between включающее…     
    я тебя понял, но правильнее будет сказать, что $data_zakaza это не дата, а строка, в русском формате даты-времени. дата (таймстамп) в PHP имеет тип int, а не string. (а еще есть класс DateTime)вот глянь, надеюсь найдешь полезное для себя: viewtopic.php?f=20&t=50838&p=404504#p404369Добавлено спустя 10 минут 3 секунды:Терпеть не могу подобное `baza_orderov` ! А почему поле не `otpechatok_vremeni`, что за мешанина?!
    Один-эсовщина, будь она неладна!
     
  9. skorpion

    skorpion Активный пользователь

    С нами с:
    6 фев 2011
    Сообщения:
    56
    Симпатии:
    1
    Адрес:
    Москва
    Спасибо большое! Всё заработало как нужно! =)
     
  10. skorpion

    skorpion Активный пользователь

    С нами с:
    6 фев 2011
    Сообщения:
    56
    Симпатии:
    1
    Адрес:
    Москва
    Дополнительный вопрос:
    Подскажите пожалуйста, как получить общую сумму из выведенных результатов таблицы $result['total']...

    Код (PHP):
    1.     $sql = mysql_query("SELECT * FROM `baza_orderov` AS bo WHERE bo.`timestamp` BETWEEN {$d3} AND {$d4} ORDER BY `order_id` $sort_by", $link);
    2.     while ($result = mysql_fetch_array($sql)) {
    3.         $summa = $result['total'];
    4. ........
    5. }
    6.  
    Например вывелось 25 строк с разными цифрами:
    7
    45
    96
    11
    23
    а как вывести результат общей суммы этих 25 строк?
     
  11. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    объявить перед запросом некоторую переменную дав ей нулевое значение
    итерируя результат запроса прибавлять к этой переменной значение нужного поля
     
  12. skorpion

    skorpion Активный пользователь

    С нами с:
    6 фев 2011
    Сообщения:
    56
    Симпатии:
    1
    Адрес:
    Москва
    А как это изобразить? Покажи плиз...
     
  13. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    $sum=0;
    while($r=fetch()){$sum+=$r['field'];}
     
  14. skorpion

    skorpion Активный пользователь

    С нами с:
    6 фев 2011
    Сообщения:
    56
    Симпатии:
    1
    Адрес:
    Москва
    Вылетает ошибка Fatal error: Call to undefined function fetch() in

    и я не понял в какое место это подставить?
     
  15. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    а это метаязык. знаком с таким? можно программу на русском описать, можно на английском, можно на метаязыке. в данном случае я использовал мету для ускорения написания ответа. ты уже сам должен додумать что из этого должно быть заменено и на какие конструкции языка пхп.
     
  16. skorpion

    skorpion Активный пользователь

    С нами с:
    6 фев 2011
    Сообщения:
    56
    Симпатии:
    1
    Адрес:
    Москва
    к сожалению я не программист.... я психолог. я попросил помощи, показать как это сделать.
    Додумать не получится по причине отсутствия необходимых знаний....
     
  17. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    понятно... вот тебе мод твоего кода.
    Код (PHP):
    1. $total_summa=0; // объявили нулевую итоговую сумму.
    2. $sql = mysql_query("SELECT * FROM `baza_orderov` AS bo WHERE bo.`timestamp` BETWEEN {$d3} AND {$d4} ORDER BY `order_id` $sort_by", $link);
    3.     while ($result = mysql_fetch_array($sql)) {
    4.         $total_summa += $result['total']; // прибавили тотал к сумме тоталов.
    5.         $summa = $result['total'];
    две строки добавлено, ноль изменено.
     
  18. skorpion

    skorpion Активный пользователь

    С нами с:
    6 фев 2011
    Сообщения:
    56
    Симпатии:
    1
    Адрес:
    Москва
    Спасибо большое!
    То что нужно! Теперь я понял ка это делать!
    Благодарю!