You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 06:25:22