猿问

为什么使用order by或latest对时间戳进行排序只能按日期排序而不是按时间排序?

我正在使用 Laravel。我将此行添加到控制器中

$remarks = Remarks::where('document_id', $document->id)->orderBy('created_at', 'DESC)->get();

或者

$remarks = Remarks::where('document_id', $document->id)->latest('created_at')->get();

我习惯于foreach获取每一条评论。
这些是结果$remark->$description

2019年11月10日 - 上午8:29
2019年10月10日 - 下午2:49 2019年
10月10日 - 下午3:57
2020年9月13日 - 下午2:06 2020
年9月13日 - 下午2:08

它应该是

2020年9月13日 - 下午2:08
2020年9月13日 - 下午2:06
2019年11月10日 - 上午8:29 2019年
10月10日 - 下午3:57
2019年10月10日 - 下午2:49

另外,即使当我将 ASC 或 DESC 更改orderBy为 ASC 或 DESC 时,它也不会影响视图中的任何内容,它总是显示此

2019年11月10日 - 上午8:29
2019年10月10日 - 下午2:49 2019年
10月10日 - 下午3:57
2020年9月13日 - 下午2:06 2020
年9月13日 - 下午2:08


慕田峪9158850
浏览 90回答 1
1回答

Cats萌萌

这里的问题是,您似乎正在存储文本时间戳,而且这些时间戳的格式不允许按它们排序以给出任何有意义的时间顺序。这里的一种解决方法是不对此进行排序:Nov. 10, 2019 - 8:29 am将此作为日期排序,使用STR_TO_DATE:STR_TO_DATE('Nov. 10, 2019 - 8:29 am', '%b. %d, %Y - %h:%i %p')我们可以orderByRaw在 Laravel 中使用:$remarks = Remarks::where('document_id', $document->id)     ->orderByRaw("STR_TO_DATE(created_at, '%b. %d, %Y - %h:%i %p') DESC")     ->get();作为一些一般建议,您可能需要考虑在 MySQL 中将created_at列设置为datetime或 a timestamp。如果您这样做,那么降序排序将起作用,而不必求助于使用STR_TO_DATE.
随时随地看视频慕课网APP
我要回答