首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何查询以显示不同月份的数据?

如何查询以显示不同月份的数据?
EN

Stack Overflow用户
提问于 2022-01-07 03:05:27
回答 4查看 72关注 0票数 1

因此,我有一个视图报告显示,它将句点从和周期筛选到,如下所示:

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

然后,当我查看报告时,二月份的end_date不会出现,因为处理的时间和处理的时间仅在一月份。它应该会出现,因为start_date是在一月份。

这是我的问题,请帮忙。

代码语言:javascript
复制
$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');
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2022-01-07 03:57:34

开始日期确实在两个日期参数之间,但是在开始日期上执行而不是筛选,只在结束日期上进行筛选!从开始日期起,您需要将其设置为非零值。

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

你应该要么

仅在开始日期( ("(a.start_date BETWEEN '$data[from]' AND $data[to]) OR (a.end_date BETWEEN '$data[from]' AND '$data[to]')). )(

  1. filter )或在开始日期和结束日期使用
  2. 筛选器,但是使用or运算符,否则突出显示的行将不会被返回

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

票数 0
EN

Stack Overflow用户

发布于 2022-01-07 03:46:04

解决方案1:如果该查询有效,将使用该查询:

代码语言:javascript
复制
->where("('$data[from]' BETWEEN a.start_date AND a.end_date) OR ('$data['to']' BETWEEN a.start_date AND a.end_date");

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

代码语言:javascript
复制
    $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;
票数 0
EN

Stack Overflow用户

发布于 2022-01-07 04:12:14

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

代码语言:javascript
复制
where least(a.end_date, <period-end-date>) >= greatest(a.start_date, <period-start-date>)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70616141

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档