Laravel 5.8中如何将VARCHAR类型的created_at转为TIMESTAMP/DATETIME
解决Laravel 5.8中VARCHAR类型created_at字段的排序/转换问题
嘿,这个场景我之前也碰到过——没法改表结构的情况下,确实只能在查询层面做字段转换啦。咱们分常用数据库类型给你说具体的实现方式:
MySQL 环境下的处理
MySQL提供了STR_TO_DATE()函数,可以把字符串格式的日期转换成DATETIME类型,直接在Laravel的查询构造器里用DB::raw()调用它就行。
仅做时间排序(不返回转换后字段)
如果你只是需要按正确的时间顺序排序,不需要把转换后的字段返回给前端,这样写就够了:
$winners = DB::table('winner') ->select('msisdn', 'created_at') ->orderByRaw("STR_TO_DATE(created_at, '%Y-%m-%d %H:%i:%s') DESC") ->get();
同时返回转换后的标准时间字段
如果需要把转换后的标准时间字段也返回出来(方便后续用Carbon处理),可以在select里同时加上转换逻辑:
$winners = DB::table('winner') ->select( 'msisdn', 'created_at', DB::raw("STR_TO_DATE(created_at, '%Y-%m-%d %H:%i:%s') AS converted_created_at") ) ->orderByRaw("STR_TO_DATE(created_at, '%Y-%m-%d %H:%i:%s') DESC") ->get();
⚠️ 重要提醒:%Y-%m-%d %H:%i:%s这个格式字符串必须和你created_at字段实际存储的字符串格式完全匹配!比如如果你的字段存的是2024/05/20 12:34,就要改成%Y/%m/%d %H:%i;如果是带T的ISO格式2024-05-20T12:34:56,就得用%Y-%m-%dT%H:%i:%s,格式不匹配会导致转换结果为NULL,排序就彻底乱了。
PostgreSQL 环境下的处理
如果你的项目用的是PostgreSQL,就换成TO_TIMESTAMP()函数,用法类似:
// 仅做时间排序 $winners = DB::table('winner') ->select('msisdn', 'created_at') ->orderByRaw("TO_TIMESTAMP(created_at, 'YYYY-MM-DD HH24:MI:SS') DESC") ->get(); // 同时返回转换后的标准时间字段 $winners = DB::table('winner') ->select( 'msisdn', 'created_at', DB::raw("TO_TIMESTAMP(created_at, 'YYYY-MM-DD HH24:MI:SS') AS converted_created_at") ) ->orderByRaw("TO_TIMESTAMP(created_at, 'YYYY-MM-DD HH24:MI:SS') DESC") ->get();
同样要注意调整格式字符串适配你的存储格式,PostgreSQL的格式占位符和MySQL略有区别,比如小时用HH24表示24小时制,按需调整即可。
内容的提问来源于stack exchange,提问作者user11352561
相关产品推荐
相关产品推荐

