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

如何在Laravel/Lumen查询构造器中使用MySQL CONVERT_TZ函数?

解决Laravel/Lumen中CONVERT_TZ函数的时区引号参数问题

嘿,我来帮你搞定这个CONVERT_TZ的参数问题~其实核心原因是CASE WHEN里用到的是SQL原生的判断逻辑和数值,不需要引号包裹;但CONVERT_TZ的时区参数是字符串类型,必须用引号处理,下面给你两种可行的解决方式:

方式一:直接在DB::raw中添加转义引号

你可以直接在DB::raw()的字符串里,用转义单引号\'把时区参数包裹起来,这样Laravel编译SQL时会正确识别:

$result['tests'] = Test::select(
    'test.test_id',
    DB::raw('convert_tz(test.updated_at, \'+00:00\', \'-05:30\') as updated_at'),
    'test.created_at'
)
->orderBy('test.test_id', 'ASC')
->get()
->toArray();

方式二:参数绑定(更安全,适合动态时区)

如果你的时区参数是动态获取的(比如从配置、用户输入来),推荐用参数绑定的方式,既能自动处理引号,还能避免SQL注入风险:

$fromTimezone = '+00:00';
$toTimezone = '-05:30';

$result['tests'] = Test::select(
    'test.test_id',
    DB::raw('convert_tz(test.updated_at, ?, ?) as updated_at'),
    'test.created_at'
)
->setBindings([$fromTimezone, $toTimezone])
->orderBy('test.test_id', 'ASC')
->get()
->toArray();

这样写就和你处理CASE WHEN的思路统一了——把动态/特殊参数单独处理,而不是硬写在原生SQL字符串里。

内容的提问来源于stack exchange,提问作者Sobin Augustine

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:37:54