Переписанный MySQL оператор

SELECT DATE(STR_TO_DATE(CONCAT(CONCAT(YEAR('$uDate1'), week), ' Monday'), '%X%V %W') + 
    INTERVAL (7 - DAYOFWEEK(STR_TO_DATE(CONCAT(CONCAT(YEAR('$uDate1'), week), ' Monday'), 
    '%X%V %W'))) DAY)
     as week_end_date

Что это заявление делает, это берет дату, которую я даю ему ($uDate1), и дает мне дату конца недели ( суббота) этой недели. Это работает хорошо, и я доволен этим, своего рода.

Мне было интересно, есть ли некоторые вещи, которые я пропустил, которые либо сделают это более эффективным, или даже если я пропустил некоторые ярлыки к этому.

Есть предложения для меня?


week >= WEEK('$uDate1') AND week <= WEEK('$uDate2')

Это в моем пункте WHERE. Так что в основном, если я использую это…

DATE('$uDate1', INTERVAL 7 - DAYOFWEEK('$uDate1') DAY)

…затем он возвращает один и тот же день для всех записей. Мне нужно, чтобы это было возможно в течение нескольких недель.


У меня есть столбец в моей базе данных с именем «week». Он просто хранит INT, который соответствует неделе года. (бывший. 21 на этой неделе)

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

5/10/2016 & 5/26/2016 выходы 14.05.2016, 21.05.2016, 28.05.2016

То, что экспортируется в CSV-файл, выглядит примерно так..

WEEK END, LAST NAME, FIRST NAME, ...
5/10/2016, Smith, John, ...
5/26/2016, Jones, James, ...

Он выводит всех, у кого были часы в течение недели, с датой окончания недели.

Примечание: Я ценю комментарии и помощь. Я не хочу, чтобы кто-то подчеркивал это! Просто любопытно, если лучший способ. 🙂

2 ответа

  1. Как я уже упоминал в комментарии, вы должны переместить это преобразование из mysql query в php код.

    Я не вижу причин делать этот расчет на стороне mysql.

    http://ideone.com/48zLvF

    $week_day = intval(date('w',$uDate1));
    
    if ($week_day<6) {
      $end_of_week = $uDate1+(86400*(6-$week_day));
    } else {
      $end_of_week = $uDate1;
    }
    
  2. Я не уверен, почему ваш текущий SQL так сложен.

    Вы говорите, что это просто взять дату и дать мне дату конца недели (суббота) этой недели .

    Как вы делаете это в данный момент:-

    • Yours is taking the year
    • Добавление недели года (я предполагаю-должна быть неделя (‘$uDate1’) я думаю)
    • Добавление в день в виде строки (например, на сегодня это будет 2016 21 понедельник )
    • Изменение этой строки обратно на дату значение datetime
    • Преобразование значения datetime обратно в значение date.
    • Затем принимая год снова
    • Добавление недели года снова
    • Получение дня недели результирующей строки. Как вы сцепили понедельник на дату, то день недели всегда будет 2.
    • Беря этот результирующий день недели и вычитая его из 7. Поскольку день недели всегда будет 2, это всегда приведет к 5
    • Добавление в день в виде строки (например, на сегодня это будет 2016 21 понедельник ).
    • Затем это значение добавляется к ранее рассчитанной дате, беря дату понедельника и добавляя 5 дней.

    Мое предложение было просто использовать:-

    DATE_ADD($uDate1, INTERVAL 7 - DAYOFWEEK($uDate1) DAY) 
    

    что намного проще и, кажется, покрывает ваши требования.

    РЕДАКТИРОВАТЬ

    Глядя на ваше редактирование, вы хотите список всех суббот за недели все или частично между 2 прошедшими датами.

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

    SELECT DATE_ADD(DATE_ADD('$uDate1', INTERVAL 7 - DAYOFWEEK('$uDate1') DAY), INTERVAL `week` WEEK) AS aDate
    FROM `week`
    HAVING aDate  BETWEEN '$uDate1' AND DATE_ADD('$uDate2', INTERVAL 7 - DAYOFWEEK('$uDate2') DAY)
    ORDER BY aDate