我一直在尝试通过向另一列添加 5 年间隔来更新表中的一列,并且总是出现语法错误异常。以下是我的 PHP 脚本:
\App\Models\MyModel::where('cl1', $cl1Value)
->where('cl2', ">=", $startingFrom)
->where('cl2', '<=', $endingAt)
->update([
'cl3' => DB::raw('date_add(cl2 + INTERVAL 5 YEARS)')
]);
cl1 是 int 数据类型,cl2 和 cl3 是时间戳数据类型。
#cl1Value
、$startingFrom
和 $endingAt
是从脚本的其他部分传递的。广告在下面的答案中指出,存在与 date_add()
相关的语法错误,但即使修复了该错误,我仍然有类似的错误消息。我通过数字5的方式似乎有问题。
以下是我运行此脚本时的错误消息。
Illuminate\Database\QueryException : SQLSTATE[42601]: Syntax error: 7 ERROR: syntax error at or near "5" LINE 1: ... "cl3" = date_add(cl2 + INTERVAL 5 YEARS) w... ^ (SQL: update "my_models" set "cl3" = date_add(cl2 + INTERVAL 5 YEARS) where "cl1" = 630 and "cl2" >= 2024-09-01 00:00:01 and "cl2" <= 2024-12-15 00:00:00)
有人可以建议我在这里做错了什么吗?如果我在 mysql 控制台中运行生成的 SQL 脚本或其他变体(例如以下内容),我不会收到语法错误。
->update(['cl3' => DB::raw('cl2 + INTERVAL 5 YEARS'])
UPDATE my_models SET cl3 = cl2 + INTERVAL 5 YEAR WHERE cl2 >= '2024-09-01 00:00:00' AND cl2 <= '2024-12-15 00:00:00' AND cl1 = 630;
Query OK, 0 rows affected (0.003 sec)
Rows matched: 0 Changed: 0 Warnings: 0
我能看到的唯一区别是时间戳字符串在我输入 mysql 控制台的脚本中被转义。
我从 Laravel v6 + MariaDB v10.11.10 运行这个。
谢谢。
函数 date_add 的语法不正确。将函数中的加号替换为逗号,如下所示:
\App\Models\MyModel::where('cl1', $cl1Value)
->where('cl2', ">=", $startingFrom)
->where('cl2', '<=', $endingAt)
->update([
'cl3' => DB::raw('date_add(cl2, INTERVAL 5 YEARS)')
]);