我想通过将时区偏移+05:54从位置表中获取当前日期的所有max_id
和min_id
。我试过了
$maxminpositionids = DB::table('tc_positions')
->select(DB::raw('max(id) maxid, min(id) minid, deviceid, date(CONVERT_TZ(servertime,\'+00:00\',\'+05:45\' )) as serv'))
->where('serv', '=', Carbon::now()->toDateString())
->get();
我有这个错误
有什么方法可以解决和优化此查询?
最佳答案
在MySQL中,可以在select
子句中创建列别名,但是,由于语法无效,因此不能在同一查询的where
子句中使用它们。我只能猜测原因,这可能是一个依赖性问题,因为当搜索记录时,引擎将检查它们是否在结果集中,然后才在select子句中运行逻辑。这只是一个猜测,但这很合理,因为如果选择部分首先运行,查询会慢很多,而且,我们会遇到诸如需要原始字段以及可能创建与现有列相同的别名之类的问题名称。无论我对问题的原因是否正确,都不能在where
子句中使用列别名。相反,只需调用whereRaw
并将相同的值传递给它:
$serv = 'date(CONVERT_TZ(servertime,\'+00:00\',\'+05:45\' ))';
$maxminpositionids = DB::table('tc_positions')
->select(DB::raw('max(id) maxid, min(id) minid, deviceid, '.$serv.' as serv'))
->whereRaw($serv.'= ?', Carbon::now()->toDateString())
->get();