2017-10-05 9 views
0

日付範囲の大きさにかかわらず、指定した時刻間にのみデータを取得できる必要があります。たとえば、日付範囲内の毎日10時から11時の間のレコードのみを取得します。MySQL TIME関数の予期しない結果

ユーザーが深夜を過ぎ、データを返さないように指定するまで、私はそれを釘付けにしていたと思いました。

これは(DATEおよび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

ああ、私はそれを分割する必要はないと思っていました。 UIはHTML/PHP&Javascriptです。追加するチェックを追加するだけです。 – Stephen

0

私は専門家でないが、あなたはDATE_FORMATを使用することができませんでしたか?次のようなものがあります:DATE_FORMAT(FROM_UNIXTIME(ql.time_id)、 '%Y-%m-%d%H:%i') '2017-10-03 16:00' AND '2017-10-04 01:01'