2017-02-01 5 views
0

私はusersテーブルとtasksテーブルを持っています。ユーザーはタスクを割り当てることができます。各タスクには特定の時間がかかります。私はuser_idの外部キー、date_start(unixタイムスタンプ)、date_stop(unixタイムスタンプ)を持っているタスクテーブルで。特定の時間範囲内でビジーでないユーザーを選択する

私は、今日の午前2時30分から午後4時までの間に新しいタスクを、その時間内に無料のランダムなユーザーに割り当てたいとします(新しいタスクに重複するタスクは割り当てられません) )。

このようなユーザーを取得するための適切なSQLクエリは何でしょうか?

+0

(http://stackoverflow.com/questions/325933/determine-whether-two-date-ranges-overlap) –

+0

@PaulSpiegel、それ[かどうかは、2つの日付の範囲が重複する決定]の可能重複オーバーラップではありません。この質問はより簡単です。なぜなら、 'date_start'と' date_stop'は線形的に並べ替えることができるということです(少なくとも、あるはずです)。 –

+0

リンクされた質問の答えは、2つの範囲が重複しているかどうかを確認する方法を示しています。これで 'NOT EXISTS'副問い合わせが必要になります。 –

答えて

0

date_startは常にdate_stopの前であると仮定します。

基本的に私は、午後4時以降に開始するタスク、または午前2時30分までに終了するタスクを持つユーザーを考慮します。

limit 1はもちろん、DBから取得された1人のユーザーだけに責任があります。

select * from (
    select * from users 
    join tasks on users.user_id = tasks.user_id 
    where unix_timestamp(str_to_date('Feb 02 2017 04:00pm', '%M %d %Y %h:%i%p')) < from_unixtime(tasks.date_start) 
    or 
    unix_timestamp(str_to_date('Feb 02 2017 02:30am', '%M %d %Y %h:%i%p')) > from_unixtime(tasks.date_stop) 
) limit 1 
+0

これは、重複しないタスクを持つユーザーを検出します。しかし、同じユーザーに別のタスクを割り当てることができますが、これは重複しています。 –

+0

良い点、ポール。私はそれに応じて私の答えを変更しました。 –

0
select u.id 
from users u 
cross join tasks new_task 
where new_task.id = :your_task_id 
    and not exists (
    select * 
    from tasks user_task 
    where user_task.user_id = u.id 
     and user_task.date_start < new_task.date_stop 
     and user_task.date_stop > new_task.date_start 
) 
limit 1 
関連する問題