【问题标题】:How to query to display data that has different months?如何查询显示不同月份的数据?
【发布时间】:2022-01-07 03:05:27
【问题描述】:

所以,我有一个视图报告显示,它过滤 Period From 和 Period To,如下所示:

而且,我有日期如下的员工数据:

然后,当我查看报告时,2 月的 end_date 不会出现,因为 Period From 和 To 过程仅在一月。它应该会出现,因为 start_date 是在一月份。

这是我的问题,请帮忙。

$this->db->select("a.id, a.employee_id, a.employee_name, a.leave_name, a.start_date, a.end_date, a.status, 
                   b.id, b.employee_id, b.job_title_name, b.employment_status_name")
         ->join('hr_employee b', 'a.employee_id = b.employee_id', 'left')
         ->where("a.start_date AND a.end_date BETWEEN '$data[from]' AND '$data[to]'");

   return $this->db->get('hr_leaves a');

【问题讨论】:

    标签: php mysql codeigniter


    【解决方案1】:

    开始日期确实在两个日期参数之间,但您过滤开始日期,只过滤结束日期!从开始日期开始,您需要将其设置为非零值。

    由于结束日期不在参数指定的日期范围内,因此突出显示的行被过滤掉。

    你应该

    1. 仅过滤开始日期 ("a.start_date BETWEEN '$data[from]' AND '$data[to]') 或
    2. 过滤开始日期和结束日期,但使用 or 运算符,否则将不会返回突出显示的行 ("(a.start_date BETWEEN '$data[from]' AND $data[to]) OR (a.end_date BETWEEN '$data[from]' AND '$data[to]'))。

    还请注意,您应该使用参数而不是字符串插值来在查询中包含 from 和 to 参数。

    【讨论】:

    • 这是一个常见的错误,认为您可以只检查或范围检查开始日期和结束日期。但它不起作用。如果 from 和 to 是 2022-01-01 和 2022-01-31,这将找不到带有例如的行a.start_date 2021-12-31 和 a.end_date 2022-02-01
    【解决方案2】:

    解决方案 1: 如果有效,请使用此查询:

    ->where("('$data[from]' BETWEEN a.start_date AND a.end_date) OR ('$data['to']' BETWEEN a.start_date AND a.end_date");
    

    解决方案 2: 创建一个日期间隔并查询员工开始和结束日期之间的每个日期,如果为真,则添加到列表$sql_res

        $begin = new DateTime($data['from']);
        $end = new DateTime($data['to']);
        
        $interval = DateInterval::createFromDateString('1 day');
        $period = new DatePeriod($begin, $interval, $end);
        
        $sql_res = array();
        foreach ($period as $dt) {
            $curent_date = $dt->format("Y-m-d");
            $this->db->select("a.id, a.employee_id, a.employee_name, a.leave_name, a.start_date, a.end_date, a.status, 
                       b.id, b.employee_id, b.job_title_name, b.employment_status_name")
             ->join('hr_employee b', 'a.employee_id = b.employee_id', 'left')
             ->where("$curent_date BETWEEN a.start_date AND a.end_date");
    
             $sql_res[] = $this->db->get('hr_leaves a')->row();
        }
    
        return $sql_res;
    

    【讨论】:

      【解决方案3】:

      如果您希望期间过滤器查找日期范围完全重叠的任何员工数据,您需要:

      where least(a.end_date, <period-end-date>) >= greatest(a.start_date, <period-start-date>)
      

      【讨论】:

      • 查询怎么写?
      • 我不知道 codeignitor 或你正在使用的任何东西,但你的问题显示调用 ->where 来提供任意 where 条件,所以大概你可以这样做。
      【解决方案4】:

      检查“重叠”时间范围:

      "a.start_date AND a.end_date BETWEEN '$data[from]' AND '$data[to]'"
      

      我建议这样简洁,虽然有点神秘:

      "a.start_date <= '$data[to]'  AND   -- eg, hire_date <= '2022-01-31'
       a.end_date   >= '$data[from]'      -- eg, quit_date >= '2022-01-01'
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-09-09
        • 1970-01-01
        • 2020-04-03
        • 2013-11-16
        • 2017-07-16
        • 1970-01-01
        • 2013-09-04
        • 1970-01-01
        相关资源
        最近更新 更多