如何通过向另一列添加间隔来更新一列

问题描述 投票:0回答:1

我一直在尝试通过向另一列添加 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 运行这个。

谢谢。

laravel eloquent
1个回答
0
投票

函数 date_add 的语法不正确。将函数中的加号替换为逗号,如下所示:

\App\Models\MyModel::where('cl1', $cl1Value)
              ->where('cl2', ">=", $startingFrom)
              ->where('cl2', '<=', $endingAt)
              ->update([
                         'cl3'  =>  DB::raw('date_add(cl2, INTERVAL 5 YEARS)')
                      ]);
© www.soinside.com 2019 - 2024. All rights reserved.