Групповой запрос по времени в MySQL выдает ошибку - PullRequest
2 голосов
/ 10 декабря 2011

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

Код ошибки 1064, состояние SQL 42000: у вас ошибка в SQL синтаксис; проверьте руководство, соответствующее вашей версии сервера MySQL для правильного синтаксиса использовать около 'TO 8, а затем' 8Hrs ' КОГДА раунд (time_to_sec (timediff (now (), `create_date_t ') в строке 4

SELECT t.range, count(*) as num
FROM (
SELECT CASE
    WHEN round(time_to_sec(timediff(now() , `created_date_time`))/3600) BETWEEN 0 TO 8 then '8Hrs'
    WHEN round(time_to_sec(timediff(now() , `created_date_time`))/3600) BETWEEN 9 TO 16 then '16Hrs'
    WHEN round(time_to_sec(timediff(now() , `created_date_time`))/3600) BETWEEN 17 TO 24 then '24Hrs'
    WHEN round(time_to_sec(timediff(now() , `created_date_time`))/3600) > 24 then 'G24Hrs'
    AS range
    FROM `ticket`
)  as t     
GROUP BY range

И я должен избегать повторения

round(time_to_sec(timediff(now() , created_date_time))/3600)   

заявление.

структура таблицы

id  created_date_time   issue   
-------------------------------------
1   2011-12-07 05:29:28 test  
2   2011-12-08 07:56:15 test  
3   2011-12-08 05:56:15 test  

создать запрос

CREATE TABLE `ticketingsystem`.`ticket` (
`id` bigint( 20 ) NOT NULL AUTO_INCREMENT ,
`created_date_time` datetime NOT NULL ,
`issue` text NOT NULL ,
PRIMARY KEY ( `id` )
) ENGINE = MYISAM DEFAULT CHARSET = latin1   

Я хочу ниже вывода

в этих полях нет записей, ожидающих времени с момента создания записи

8hrs    16hrs   24hrs   >24hr
---------------------------------
3       2        6      4

Ответы [ 2 ]

3 голосов
/ 10 декабря 2011

В вашем запросе много ошибок, поэтому я все переписал.

Прежде всего, я предлагаю вам создать VIEW. Это разовая вещь.

CREATE VIEW ticket_wait AS
  SELECT HOUR(TIMEDIFF(NOW(), created_date_time)) AS hdiff
  FROM ticket;

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

SELECT COUNT(hdiff) count,
  CASE
    WHEN hdiff BETWEEN 0 AND 8 THEN '8Hrs'
    WHEN hdiff BETWEEN 9 AND 16 THEN '16Hrs'
    WHEN hdiff BETWEEN 17 AND 24 THEN '24Hrs'
  ELSE '>24Hrs'
END `range`
FROM ticket_wait
GROUP BY `range`

Используя приведенный выше запрос к таблице

+----+---------------------+-------+
| id | created_date_time   | issue |
+----+---------------------+-------+
|  1 | 2011-12-10 07:06:44 | foo   |
|  2 | 2011-12-08 04:29:28 | foo   |
|  3 | 2011-12-08 23:29:28 | foo   |
|  4 | 2011-12-08 14:29:28 | foo   |
|  5 | 2011-12-09 12:29:28 | foo   |
|  6 | 2011-12-09 17:29:28 | foo   |
|  7 | 2011-12-09 23:29:28 | foo   |
|  8 | 2011-12-10 06:29:28 | foo   |
|  9 | 2011-12-10 04:29:28 | foo   |
| 10 | 2011-12-10 01:29:28 | foo   |
+----+---------------------+-------+

Ваш вывод будет

+-------+--------+
| count | range  |
+-------+--------+
|     1 | 16Hrs  |
|     1 | 24Hrs  |
|     5 | 8Hrs   |
|     3 | G24Hrs |
+-------+--------+
2 голосов
/ 10 декабря 2011

Как и наблюдение Кристиана о BETWEEN X AND Y, вы упускаете END из вашего CASE заявления:

SELECT CASE
    WHEN ...
    WHEN ...
END AS `RANGE` -- Note the END!
FROM ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...