从 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 的日期字段中选择月份的主要内容,如果未能解决你的问题,请参考以下文章

Laravel - 如何在日期字符串中检查当前月份?

在输入字段 c# 中的 Unity 上显示从日历中选择的日期

从日期字段中选择特定数据

如何在 extjs 日期字段或日期选择器中访问更改月份事件

使用 PHP 使用两个日期字段和当前月份选择表条目

如何仅显示月份和年份字段的 android 日期选择器?