php - 用于时间比较和排序的 Laravel 查询生成器
问题描述
我有两张桌子
courses [ id, nsu_id, course, section, class_start, class_end ] and
orders [ id, nsu_id]
在课程表中有多个课程和课程开始时间。
我想比较class_start 和当前时间。
如果 class_start 时间大于当前时间,那么我将为单个 nsu_id 存储第一个 class_start 时间,因为 [nsu_id] 有多个 class_start 时间 [最重要的事情]。
然后对class_start时间进行排序。
为了解决这个问题,这就是我对控制器所做的。
public function xyz()
{
$time = new DateTime('now', new DateTimezone('Asia/Dhaka'));
$now=$time->format('H:i a');
$courses=Course::join('orders', 'orders.nsu_id', '=', 'courses.nsu_id')
->select('orders.*','courses.class_start')
->where('class_start', '>', $now)
->orderBy('class_start', 'ASC')
->get();
return view('xyz',compact('courses'));
}
我得到了这种结果
[问题: ]
- Class_start 时间排序不正确。
- 相同的 nsu_id 有多个 class_start 时间。
那么,有什么合乎逻辑的方法来解决这个问题吗?
解决方案
您可以group by
订购,并通过以下方式选择最短开始时间MIN
$courses = Course::join('orders', 'orders.nsu_id', '=', 'courses.nsu_id')
->select('orders.nsu_id', DB::raw('MIN(courses.class_start) AS class_start'))
->where('courses.class_start', '>', $now)
->groupBy('orders.nsu_id')
->get();
编辑:
因为class_start
是一个字符串,时间是 12 小时 AM 或 PM 格式。
您可以使用STR_TO_DATE()
将字符串转换为datetime
然后获得最短时间:
->select('orders.nsu_id', DB::raw("DATE_FORMAT(MIN(STR_TO_DATE(CONCAT('2020-04-05 ', class_start), '%Y-%m-%d %h:%i %p')), '%h:%i %p') AS class_start"))
推荐阅读
- android - 如何为 dataclient.getDataItem(Uri) 获取我自己的 node_id?
- mysql - 如何使用窗口函数计算 Mysql 中的回撤?
- javascript - 一个页面中有两个或多个 SVG。如何在按钮单击时为它们设置动画?
- methods - 编译器/解释器设计:内置方法应该有自己的节点还是应该使用查找表?
- python - Python - 将前缀(公斤等)转换为基数
- r - 使用存储过程在 SQL 表中插入 R 数据帧
- c# - 如何将具有对象列表的类作为属性绑定到转发器?
- ghost-blog - 在 URL 中使用斜杠?
- java - 无法在 Spring Boot 上构建可执行 JAR
- javascript - 与 Antd Form 反应 onFinish 不检索数据