2017-10-05 89 views
0

我需要只能在指定时间之间提取数据,而不管日期范围有多大。例如,仅在日期范围内的每天10:00至11:00之间检索记录。MySQL TIME函数意外的结果

我想我已经确定了它,直到用户指定了一个跨越午夜的时间并且它没有返回任何数据。

这是我的查询没有返回数据(使用日期和时间函数):

SELECT 
an.descr_agente as Agent, 
COUNT(if(ql.queue IN (9100, 9102, 9104),1, null)) as UK, 
COUNT(if(ql.queue IN (9200, 9202, 9204),1, null)) as AU, 
COUNT(if(ql.queue IN (9400, 9402, 9404),1, null)) as CA 
FROM queue_log ql 
LEFT JOIN agenti_noti an 
ON ql.agent = an.nome_agente 
WHERE ql.partition = 'P001' 
AND DATE(from_unixtime(ql.time_id)) BETWEEN '2017-10-03' AND '2017-10-04' 
AND TIME(from_unixtime(ql.time_id)) BETWEEN '16:00' AND '01:01' 
AND ql.verb IN ('COMPLETECALLER','COMPLETEAGENT','TRANSFER') 
AND an.descr_agente IS NOT NULL 
GROUP BY an.descr_agente 

如果我将其更改为下面,它的工作原理,但当然会有一旦用户的增加不正确的数据日期范围超过1天。

SELECT 
an.descr_agente as Agent, 
COUNT(if(ql.queue IN (9100, 9102, 9104),1, null)) as UK, 
COUNT(if(ql.queue IN (9200, 9202, 9204),1, null)) as AU, 
COUNT(if(ql.queue IN (9400, 9402, 9404),1, null)) as CA 
FROM queue_log ql 
LEFT JOIN agenti_noti an 
ON ql.agent = an.nome_agente 
WHERE ql.partition = 'P001' 
AND from_unixtime(ql.time_id) BETWEEN '2017-10-03 16:00' AND '2017-10-04 01:01' 
AND ql.verb IN ('COMPLETECALLER','COMPLETEAGENT','TRANSFER') 
AND an.descr_agente IS NOT NULL 
GROUP BY an.descr_agente 

我假设TIME函数不会自动重叠到第二天。我应该怎么做才能正常工作?

回答

1
AND (TIME(from_unixtime(ql.time_id)) BETWEEN '16:00' AND '23:59' 
OR TIME(from_unixtime(ql.time_id)) BETWEEN '00:00' AND 01:01') 

这可能需要一些UI修改或附加功能来检测交叉和创建拆分,

+0

啊我希望我不会像那样分裂它。用户界面是HTML/PHP和Javascript,我猜想我只需添加更多的检查来添加它。 – Stephen

0

我不是专家,但不能使用DATE_FORMAT?例如:DATE_FORMAT(FROM_UNIXTIME(ql.time_id),'%Y-%m-%d%H:%i')BETWEEN'2017-10-03 16:00'AND'2017-10-04 01:01'