Detect overlapping date ranges from the same table

前端 未结 9 1132
甜味超标
甜味超标 2020-12-01 04:26

I have a table with the following data

PKey  Start       End         Type
====  =====       ===         ====
01    01/01/2010  14/01/2010  S
02    15/01/2010         


        
相关标签:
9条回答
  • 2020-12-01 04:50

    Sql='SELECT task_id, task_start_date, task_due_date FROM (wba_task) WHERE (task_start_date <="2016-07-13" AND task_due_date >="2016-07-25") OR (task_due_date BETWEEN "2016-07-13" and "2016-07-25")';

    Codeigniter Query is below.

    $fromdaysDate="2016-07-13";//changed date
    $todaysDate="2016-07-25";//changed date
    $this->db->select('task_id,task_start_date, task_due_date'); 
    $this->db->where('task_start_date <="'.date('Y-m-d', strtotime($fromdaysDate)).'"');
    $this->db->where('task_due_date >="'.date('Y-m-d', strtotime($todaysDate)).'"');    
    $this->db->or_where('task_due_date BETWEEN "'. date('Y-m-d', strtotime($fromdaysDate)). '" and "'. date('Y-m-d', strtotime($todaysDate)).'"');   
    $alltask=$this->db->get('wba_task')->result_array();
    echo $this->db->last_query();
    

    get all overlap data form database....

    0 讨论(0)
  • 2020-12-01 04:59
    select A.*
    from MyTable A
    inner join MyTable B
    on (B.start <= A.end)
    and (B.end >= A.start)
    

    or something like that (assuming dates are not nullable and equal dates count as an overlap).

    0 讨论(0)
  • 2020-12-01 05:09

    If you already have entries for each day that should work, but if you don't the overhead is significant, and if that query is used often, if will affect performance.

    If the data is in this format, you can detect overlaps using simple date arithmetic, because an overlap is simply one interval starting after a given interval, but before the given is finished, something like

    select dr1.* from date_ranges dr1
    inner join date_ranges dr2
    on dr2.start > dr1.start -- start after dr1 is started
      and dr2.start < dr1.end -- start before dr1 is finished
    

    If you need special handling for interval that are wholly within another interval, or you need to merge intervals, i.e.

    PKey  Start       End         Type
    ====  =====       ===         ====
    01    01/01/2010  20/01/2010  S
    02    15/01/2010  31/01/2010  S
    

    yielding

    Start       End         Type
    =====       ===         ====
    01/01/2010  31/01/2010  S
    

    you will need more complex calculation.

    In my experience with this kind of problems, once you get how to do the calculation by hand, it's easy to transfer it into SQL :)

    0 讨论(0)
提交回复
热议问题