从 laravel 的日期字段中选择月份
Posted
技术标签:
【中文标题】从 laravel 的日期字段中选择月份【英文标题】:Select month from a date field in laravel 【发布时间】:2021-01-07 21:25:48 【问题描述】:我正在尝试在 Laravel 7 中执行获取日期字段的月份部分的查询。我尝试了以下查询
$test = MyModal::selectRaw('month("date_col") as temp')->get();
$test = MyModal::select(DB::Raw('month("date_col") as temp'))->get();
$test = DB::table('my_table')->select('month("date_col") as temp')->get();
同一查询的所有变体。如果我转储查询日志,则查询对所有 3 个都是正确的
select month("date_col") as temp from "my_table"
如果我在我的数据库上运行它,我也会得到结果。但我在 laravel 中不断收到此错误:
Illuminate\Database\QueryException: SQLSTATE[HY000]: General error: 1 no such function: month (SQL: select month("date_col") as temp from "my_table")
我做错了吗?有没有办法在 laravel 中做这个查询?
编辑:抱歉忘了提到这是 Laravel 的单元测试
【问题讨论】:
你在用mysql吗? @OMR 是的,我正在使用 mysql 【参考方案1】:我认为你使用Month函数的方式有问题
你没有为列名设置引号,应该是:
$test = MyModal::selectRaw('month(date_col) as temp')->get();
它应该可以工作
【讨论】:
我也尝试了不同的变体,包括带引号和不带引号以及使用全部大写“MONTH()” 抱歉忘了说这是 laravel 的单元测试。不确定我会有所作为 我认为您将测试调整为 sqLite db 而不是我的 sql .. 在 sqlite 中您可以这样做:选择 strftime('%m', dateField) as Month 我建议将您的测试数据库调整为您在程序中使用的相同数据库类型 看看:***.com/a/41482758/10573560【参考方案2】:你可以这样做:
MyModal::select(DB::raw("MONTH(date_col) month"))->get();
【讨论】:
抱歉忘了说这是 laravel 的单元测试。不确定我会有所作为【参考方案3】:感谢OMR's评论这个解决方案终于奏效了
$test = MyModel::selectRaw('strftime("%m", "date_col") as temp')->get();
更新:看起来我一开始的工作正常,单元测试是唯一引发此错误的部分。由于我在测试环境使用sqlite时使用mysql,这显然不喜欢OMR在他的评论中指出的“month()”函数。所以这个解决方案在测试中有效,但在现场无效。无法弄清楚如何更改测试环境以在内存中使用 mysql 而不是 sqlite。如果有人知道如何请在此处添加答案。
【讨论】:
以上是关于从 laravel 的日期字段中选择月份的主要内容,如果未能解决你的问题,请参考以下文章