Группировка метки времени Unix по дням, создающая неравномерно расположенные группы - PullRequest
0 голосов
/ 06 июня 2011

Я использую запрос MySQL для получения диапазона дат и времени в качестве метки времени Unix (потому что я буду конвертировать их во время Javascript).Я группирую по «FROM_UNIXTIME», как показано ниже:

SELECT 
    UNIX_TIMESTAMP(DateAndTime) as x, 
    Sum(If(Pass='Pass',1,0)) AS y, 
    Sum(If(Pass='Fail',1,0)) AS z, 
    Sum(If(Pass='Fail',1,0))/(Sum(If(Pass='Pass',1,0))+Sum(If(Pass='Fail',1,0))) AS a,
    cases.primaryApp 
FROM casehistory, cases
WHERE DATE_SUB(CURDATE(),INTERVAL 80 DAY) <= DateAndTime
AND cases.caseNumber = casehistory.caseNumber
AND cases.primaryApp = 'Promo'
GROUP BY FROM_UNIXTIME(x, '%Y-%m-%d')

Хотя я ожидал, что мои временные метки будут возвращаться равномерно (то есть, такое же количество времени между каждым днем ​​/ группой), я получаюследующие серии:

1300488140, 1300501520, 1300625099, 1300699980

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


Спасибо за ответ.Мой запрос «имел смысл» в том смысле, что он выдал то, что можно было построить на графике (группировка была выполнена по псевдониму x для значения dateandtime), но проблема заключалась в том, что при извлечении метки времени Unix из базы данных и группировке по дням возвращался ряд меток временимежду которыми не было равного расстояния.

Я решил эту проблему, вытянув только день (без времени) из поля MySQL datetime, затем - в PHP - конкатенировал пустое время с датой и преобразовал полученное значение.строка на время, затем умножение всего shebang на 1000, чтобы вернуть время Javascript, необходимое для построения диаграммы, например:

x = x . ' 00:00:00';
x = strtotime(x) * 1000;

Ответ поставил меня на правильный путь;Я приму это.Теперь моя диаграмма выглядит идеально.

1 Ответ

1 голос
/ 06 июня 2011

Вопрос очень запутанный.

Ваш оператор SQL не имеет смысла - вы группируете объекты, не найденные в операторе select.И гистограмма отображает упорядоченный набор значений - так что если с интервалом есть что-то смешное, то это не совсем гистограмма.

Но я думаю, что вы ищете ответ:

SELECT DATE_FORMAT(dateandtime, '%Y-%m-%d') as ondate
, SUM(IF(Pass='Pass',1,0)) AS passed
, SUM(IF(Pass='Fail',1,0)) AS failed
, SUM(IF(Pass='Fail',1,0))
  /(SUM(IF(pass='Pass',1,0))+SUM(IF(Pass='Fail',1,0))) AS fail_pct
, cases.primaryapp 
FROM casehistory, cases
WHERE DATE_SUB(CURDATE(),INTERVAL 80 DAY) <= dateandtime
AND cases.casenumber = casehistory.casenumber
AND cases.primaryapp = 'Promo'
GROUP BY DATE_FORMAT(dateandtime, '%Y-%m-%d')
ORDER BY 1;

И если вам нужны метки времени Unix, оберните их в ....

SELECT UNIX_TIMESTAMP(STR_TO_DATE(CONCAT(ilv.ondate, ' 00:00:00'))) AS tstamp
, passed
, failed
, fail_pct
, primaryapp
FROM (
     ...
) AS ilv

Обратите внимание, что вы все равно будете получать аномалии вокруг DST-переключателей.

C.

...