当涉及不同的年份时,为什么按日期范围查询不起作用?

吉姆鲁佛

我对Laravel中的日期范围有疑问,这让我大吃一惊。最初,查询有效,没有错误,但是我检测到,如果日期范围在不同的年份之间(12-2020至01-2021),则它不会返回任何记录。我有点讨厌检查代码,但看不到问题所在。

我在这里放置了将数据保存在数组中的查询,以及稍后在返回值之前应用日期过滤器的检查。

public function getData($filters) {

    $tasks = $this->getModel()
        ->whereIn('tasks.department_id', $filters['departmentIds'])
        ->join('departments', 'departments.id', '=', 'tasks.department_id')
        ->join('deliverables as dev', 'dev.id', '=', 'tasks.deliverable_id')
        ->leftJoin('deliverables as sub', 'sub.id', '=', 'tasks.subdeliverable_id')
        ->leftJoin('workers as st_workers', 'st_workers.id', '=', 'tasks.start_worker_id')
        ->leftJoin('workers as end_workers', 'end_workers.id', '=', 'tasks.end_worker_id')
        ->leftJoin('type_task_statuses', 'type_task_statuses.id', '=', 'tasks.status_id')
        ->leftJoin('incidences', 'incidences.task_id', '=', 'tasks.id')
        ->select('tasks.id', 'departments.name as department', 'tasks.start_worker_id', 'tasks.end_worker_id', 'st_workers.short_name as start_worker',
        'end_workers.short_name as end_worker', 'tasks.plane', 'tasks.st', 'dev.name as deliverable', 'sub.name as subdeliverable',
            'tasks.quantity', 'tasks.other_deliverable', 'tasks.start_prevision_date', 'tasks.end_prevision_date', 'tasks.start_date',
            'tasks.end_date', 'tasks.prevision_hour', 'tasks.incurred_hour', 'type_task_statuses.display_name as status', 'type_task_statuses.color', 'tasks.advance', 'tasks.agreed',
            'tasks.disagreed_date', 'tasks.supervised', DB::raw('COUNT(incidences.id) as count_incidences'))
        ->groupBy('tasks.id');

    if (array_key_exists('fromDate', $filters) && $filters['fromDate']) {
        $tasks->whereRaw('(DATE_FORMAT(tasks.end_date, "%m-%Y") >= "'.$filters['fromDate'].'" OR tasks.end_date is NULL)');
    }
    if (array_key_exists('toDate', $filters) && $filters['toDate']) {
        $tasks->whereRaw('(DATE_FORMAT(tasks.end_date, "%m-%Y") <= "'.$filters['toDate'].'" OR tasks.end_date is NULL)');
    }

    return $tasks;
}
哈里德·朱奈德(M Khalid Junaid)

我建议您在应用程序中将输入的格式设置为日期范围,而不是在数据库端应用格式设置,请参阅另一种关于anit模式的答案

假设您有以下输入以匹配数据库中的日期

$filters['fromDate'] ='12-2020';
$filters['toDate'] = '01-2021';

实际等于以下日期范围

从2020-12-01 00:00:00到2021-01-31 23:59:59


因此,让我们尝试将过滤器输入转换为该范围格式

/** 2020-12-01 00:00:00 */
$fromDate = \Carbon\Carbon::createFromFormat('d-m-Y', '01-'.$filters['fromDate'])->startOfMonth()->format('Y-m-d H:i:s');
/** 2021-01-31 23:59:59 */
$toDate = \Carbon\Carbon::createFromFormat('d-m-Y', '01-'.$filters['toDate'])->endOfMonth()->format('Y-m-d H:i:s');

现在,您可以轻松地在查询中应用这些范围,并且在数据库方面,您不需要任何格式

if (array_key_exists('fromDate', $filters) && $filters['fromDate']) {
    $fromDate = \Carbon\Carbon::createFromFormat('d-m-Y', '01-' . $filters['fromDate'])->startOfMonth()->format('Y-m-d H:i:s');
    $tasks->where(function ($query) use ($fromDate) {
        $query->whereNull('tasks.end_date')
              ->orWhere('tasks.end_date', '>=', $fromDate);
    });
}

if (array_key_exists('toDate', $filters) && $filters['toDate']) {
    $toDate = \Carbon\Carbon::createFromFormat('d-m-Y', '01-' . $filters['toDate'])->endOfMonth()->format('Y-m-d H:i:s');
    $tasks->where(function ($query) use ($toDate) {
        $query->whereNull('tasks.end_date')
              ->orWhere('tasks.end_date', '<=', $toDate);
    });
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么按时间范围查询mongoDB不起作用?

来自分类Dev

为什么此按查询分组不起作用?

来自分类Dev

为什么带有涉及计算的参数的查询在SSRS中不起作用?

来自分类Dev

为什么我的涉及if语句的JavaScript计算不起作用?

来自分类Dev

为什么保护范围不起作用?

来自分类Dev

为什么在使用按位&时!= 0起作用而== 1却不起作用?

来自分类Dev

为什么此查询不起作用?

来自分类Dev

为什么分页查询不起作用

来自分类Dev

为什么此查询不起作用

来自分类Dev

为什么单击“标题”时“按下”不起作用,但是单击“前导”属性时为什么起作用?

来自分类Dev

ElasticSearch-按日期进行范围过滤不起作用,

来自分类Dev

ElasticSearch-按日期进行范围过滤不起作用,

来自分类Dev

SQL Server日期范围查询不起作用

来自分类Dev

为什么MySQL选择日期在不同月份不起作用

来自分类Dev

为什么在调用反射方法时按引用传递变量不起作用?

来自分类Dev

为什么 css 在 Firefox 和 Chrome 中按预期工作时在 IE 中不起作用?

来自分类Dev

使用datetime模块解析日期时,为什么格式代码“%-m”和“%-d”不起作用?

来自分类Dev

角度的包含和范围:为什么这不起作用?

来自分类Dev

范围-VBA-为什么此代码不起作用?

来自分类Dev

为什么 mongoose 查询在放入 promise 函数时不起作用

来自分类Dev

标准包含日期时,Hibernate查询缓存不起作用

来自分类Dev

为什么按$ variable / @ attribute分组不起作用?

来自分类Dev

为什么按$ variable / @ attribute分组不起作用?

来自分类Dev

为什么日期转换在linq中不起作用

来自分类Dev

为什么我的日期在TypeScript中不起作用?

来自分类Dev

为什么日期比较javascript函数不起作用?

来自分类Dev

为什么我的日期比较在JavaScript中不起作用?

来自分类Dev

为什么此日期格式不起作用?

来自分类Dev

为什么我的日期验证代码不起作用?

Related 相关文章

  1. 1

    为什么按时间范围查询mongoDB不起作用?

  2. 2

    为什么此按查询分组不起作用?

  3. 3

    为什么带有涉及计算的参数的查询在SSRS中不起作用?

  4. 4

    为什么我的涉及if语句的JavaScript计算不起作用?

  5. 5

    为什么保护范围不起作用?

  6. 6

    为什么在使用按位&时!= 0起作用而== 1却不起作用?

  7. 7

    为什么此查询不起作用?

  8. 8

    为什么分页查询不起作用

  9. 9

    为什么此查询不起作用

  10. 10

    为什么单击“标题”时“按下”不起作用,但是单击“前导”属性时为什么起作用?

  11. 11

    ElasticSearch-按日期进行范围过滤不起作用,

  12. 12

    ElasticSearch-按日期进行范围过滤不起作用,

  13. 13

    SQL Server日期范围查询不起作用

  14. 14

    为什么MySQL选择日期在不同月份不起作用

  15. 15

    为什么在调用反射方法时按引用传递变量不起作用?

  16. 16

    为什么 css 在 Firefox 和 Chrome 中按预期工作时在 IE 中不起作用?

  17. 17

    使用datetime模块解析日期时,为什么格式代码“%-m”和“%-d”不起作用?

  18. 18

    角度的包含和范围:为什么这不起作用?

  19. 19

    范围-VBA-为什么此代码不起作用?

  20. 20

    为什么 mongoose 查询在放入 promise 函数时不起作用

  21. 21

    标准包含日期时,Hibernate查询缓存不起作用

  22. 22

    为什么按$ variable / @ attribute分组不起作用?

  23. 23

    为什么按$ variable / @ attribute分组不起作用?

  24. 24

    为什么日期转换在linq中不起作用

  25. 25

    为什么我的日期在TypeScript中不起作用?

  26. 26

    为什么日期比较javascript函数不起作用?

  27. 27

    为什么我的日期比较在JavaScript中不起作用?

  28. 28

    为什么此日期格式不起作用?

  29. 29

    为什么我的日期验证代码不起作用?

热门标签

归档