За последние 24 часа нас посетили 16649 программистов и 1650 роботов. Сейчас ищут 2054 программиста ...

Выборка по неделям ...

Тема в разделе "MySQL", создана пользователем lemonl, 14 ноя 2016.

  1. lemonl

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

    С нами с:
    10 июн 2009
    Сообщения:
    164
    Симпатии:
    0
    Здравствуйте,

    Подскажите как сделать выборку по неделям? Тесть количество записей за неделю определенного месяца, например Май. Обычно в месяце 5 недель, как это сделать ?
     
  2. denis01

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

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    функции по работе с датами посмотри в документации mysql
     
  3. lemonl

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

    С нами с:
    10 июн 2009
    Сообщения:
    164
    Симпатии:
    0
    Смотрел ничего не нашел ... А что за функция определяет номер недели ?
     
  4. denis01

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

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    где смотрел? я открыл документацию и там даже есть функции с названием week

    в документации week, только учти, что возвращает неделю в году от 0 до 53, если надо неделю в месяце, то арифметически посчитай
     
  5. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.115
    Симпатии:
    1.244
    Адрес:
    там-сям
    В общем случае суммировать количество записей за период так:
    Код (Text):
    1. SELECT COUNT(*)
    2. FROM mytable
    3. GROUP BY здесь_твоё_календарное_выражение
    Осталось придумать выражение, уникальное каждую неделю и каждый месяц. Вот это изменяется при смене как недели так и месяца, если начало месяца случается посреди недели.
    Код (Text):
    1. … GROUP BY DATE_FORMAT(datefield, '%Y-%m@%u')
    https://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_date-format

    пример вычисления
    Код (Text):
    1. ...
    2. 2016-10-31    2016-10@44
    3. сменился месяц
    4. 2016-11-01    2016-11@44
    5. 2016-11-02    2016-11@44
    6. 2016-11-03    2016-11@44
    7. 2016-11-04    2016-11@44
    8. 2016-11-05    2016-11@44
    9. 2016-11-06    2016-11@44
    10. сменилась неделя
    11. 2016-11-07    2016-11@45
    12. ...
    --- Добавлено ---
    Другой вариант уникальной группировки — набор из трех выражений.
    Код (Text):
    1. … GROUP BY YEAR(datefield), MONTH(datefield), WEEK(datefield, 1)
    --- Добавлено ---
    Только чуйка мне подсказывает, что недели получатся уж слишком "неравноправные". Месяц в среднем содержит 4.3 недели, то есть последняя неделя всегда короткая. Поэтому советую подумать над условиями, возможно готовая функция YEARWEEK(date,mode) подойдёт больше.
     
    Mark32, mahmuzar и denis01 нравится это.
  6. lemonl

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

    С нами с:
    10 июн 2009
    Сообщения:
    164
    Симпатии:
    0
    Нашел такой вариант :

    Код (Text):
    1. SELECT * FROM table WHERE 1 = FLOOR((DayOfMonth(date_et)-1)/7)+1 AND MONTH(date_et)=11
    Но почему-то не работает
     
  7. lemonl

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

    С нами с:
    10 июн 2009
    Сообщения:
    164
    Симпатии:
    0
    Проблема решена ! Спасибо !
     
  8. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.115
    Симпатии:
    1.244
    Адрес:
    там-сям
    что это было? :) потом видимо $count = mysql_num_rows($r) ага :)

    на всякий случай приложу здесь некоторые прикольные календарные вычисления на PHP:
    PHP:
    1. $bom = strtotime("first day of this month"); // первый день этого месяца
    2. $bom = strtotime(date('Y-m-1')); // то же самое другими словами
    вот прям для топикстартера:
    PHP:
    1. $bom = strtotime(date('Y-m-1', $d)); // первое число месяца от указанной даты,
    2. $eom = strtotime('+1 month -1 day', $bom); // последнее число этого же месяца
    3.  
    4. $monday = strtotime('-1 week', strtotime('next Monday', $d)); // понедельник той недели
    5. $lastDay = min(strtotime('+6 days', $monday), $eom); // конец недели или конец месяца, что раньше наступит
    6.  
    7. $stmt = $db->prepare("SELECT * FROM table WHERE date_et BETWEEN :d1 AND :d2"); // ну или COUNT(*) - по желанию
    8. $stmt->execute([
    9.   'd1' => date('Y-m-d', $monday),
    10.   'd2' => date('Y-m-d', $lastDay)
    11. ]);
    12. $records = $stmt->fetchAll(PDO::FETCH_ASSOC);
     
    #8 artoodetoo, 16 ноя 2016
    Последнее редактирование: 16 ноя 2016
    mahmuzar нравится это.