2014-01-17 2 views
0

Почему этот запрос исключает сегодня из возвращаемых значений?запрос на основе даты исключает сегодня из результатов

SELECT DATE(created) AS reg_date, 
     COUNT(*) AS user_reg_per_day 
FROM users 
WHERE created > (NOW() - INTERVAL 30 DAY) 
GROUP BY reg_date 

Мой запрос, кажется, хорошо, но я использую следующий PHP, чтобы заполнить пробелы:

function generate_calendar_days() { 
     // 
     $end = date("Y-m-d"); 
     $today = strtotime($end); 
     $start = strtotime("-30 day", $today); 
     $start = date('Y-m-d', $start); 

     $range = new DatePeriod(
      DateTime::createFromFormat('Y-m-d', $start), 
      new DateInterval('P1D'), 
      DateTime::createFromFormat('Y-m-d', $end)); 

     $filler = array(); 

     foreach($range as $date) { 
      $d = $date->format('Y-m-d'); 
      $filler[$d] = 0; 
     } 

     return $filler; 
    } 

Моя догадка $ сегодня не является правильным.

+3

try> = вместо> –

+1

Является ли 'created' поле даты или дата? – Andrew

+1

Почему мы предлагаем * * *? – Strawberry

ответ

-1

Я думаю, что PHP можно упростить с помощью «рецидивы» форму конструктора DatePeriod. Я считаю, что этот код должен возвращать DatePeriod, включая сегодня.

function generate_calendar_days() { 

    $start = strtotime("-30 day"); 
    $start = date('Y-m-d', $start); 
    $range = new DatePeriod(
     DateTime::createFromFormat('Y-m-d', $start), 
     new DateInterval('P1D'), 30); 

    $filler = array(); 

    foreach($range as $date) { 
     $d = $date->format('Y-m-d'); 
     $filler[$d] = 0; 
    } 

    return $filler; 
} 
1

Нет причин, по которым ваш запрос должен исключать данные из текущего дня, если нет ничего странного в том, как вы записываете данные в эту таблицу. Возможно, вы не видите его, потому что вы не заказываете свои результаты (т. Е. Он находится внизу набора результатов)?

Это даст частичные результаты дня за день 30 дней назад. Таким образом, вы могли бы рассмотреть вопрос об изменении, когда условие немного:

SELECT DATE(created) AS reg_date, 
     COUNT(*) AS user_reg_per_day 
FROM users 
WHERE created >= DATE(DATE_SUB(NOW(),INTERVAL 30 DAY)) 
GROUP BY reg_date 
ORDER BY reg_date DESC 

Ниже комментарии по вопросу обновления, так как кажется, проблема в PHP коде.

Я не совсем понимаю, почему вы должны смешивать функции strtotime с DateTime, DateInterval, DatePeriod. Хорошо видеть, что вы используете их, хотя многие разработчики сильно недооценивают.

Это сказанное я мог бы переписать эту функцию:

function generate_calendar_days($start = 'today', $days = 30, $days_in_past = true) { 
    $dates = array(); 
    try { 
     $current_day = new DateTime($start); // time set to 00:00:00 
    } catch (Exception $e) { 
     echo ('Failed with: ' . $e->getMessage()); 
     return false; 
    } 
    $interval = new DateInterval('P1D'); 
    if (true === $days_in_past) { 
     $interval->invert = 1; // make days step back in time 
    } 
    $range = new DatePeriod($current_day, $interval, $days); 

    foreach($range as $date) { 
     $dates[] = $date->format('Y-m-d'); 
    } 

    return $dates; 
} 

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

Ваш нулевой заполненный массив может быть легко построена вне вызова функции, как это:

$calendar = array_fill_keys(generate_calendar_days(), 0); 
+0

эй, я обновил сообщение с соответствующей информацией, не могли бы вы посмотреть? –

+0

@salivan В моем ответе добавлен дополнительный комментарий. –

0

Ваше предложение является совершенным, на самом деле SELECT (NOW() - INTERVAL 30 DAY) возвращает 2013-12-18 22:33:30. Я экспериментировал с подобными нечетными проблемами, и потому, что наш сервер DDBB имел другую конфигурацию времени, чем наш Apache Server, и это дает нам странные результаты.

Проверьте конфигурацию сервера времени, (http://dev.mysql.com/doc/refman/5.5/en/time-zone-support.html)

+0

Спасибо. Кажется, это проблема php. Я обновил свой пост. –

Смежные вопросы