将日期时间值与空值比较时,日期时间值不正确

时间:2019-07-16 07:27:33

标签: mysql laravel datetime null query-builder

我的数据库(mysql)中有两个datetime列-completed_at,due_date。我正在使用连接到mysql的lumen框架。问题是我的“ completed_at”列可为空并且包含空值。现在,如果它们的“ completed_at”不为空,那么我需要计算在到期日之前完成了多少记录。

我的代码是-

$completed_tasks_before = Task::where('tasks.assignee_id', $current_user->id)
                                        ->where('status','completed')
                                        ->where('completed_at', '<>', null)
                                        ->where('due_date' ,'>=', 'completed_at')
                                        ->count();

我希望这能给我提供记录的截止日期> = completed_at的记录数,但它会给我以下错误-

SQLSTATE[HY000]: General error: 1525 Incorrect DATETIME value: 'completed_at' (SQL: select count(*) as aggregate from `tasks` where `tasks`.`assignee_id` = 2 and `status` = completed and `completed_at` is not null and `due_date` >= completed_at)

4 个答案:

答案 0 :(得分:0)

您可以将whereNotNull用于not null条件。

您应该使用whereDate而不是where进行日期比较。请通过https://laravel.com/docs/5.8/queries#where-clauses进行了解。

答案 1 :(得分:0)

问题是您将const hasId = id => ({ configID } = {}) => configID === id; if (!configurationArray.some(hasId(configurationId)) { configurationArray.push(this.configuration); } else { //to do } 列与due_date STRING而不是此列的值进行比较。因此,更改此行:

completed_at

对此:

->where('due_date' ,'>=', 'completed_at')

请参见documentation->whereColumn('due_date' ,'>=', 'completed_at') 部分)

答案 2 :(得分:0)

让我解释一下。

... and `due_date` >= completed_at
                      ^
                      this is not a column, but plain string value

这就是为什么您会收到错误消息。

因此,您可以选择:

->where('column_name', '>', DB::raw('other_column_name'))

->whereRaw('column_name > other_column_name')

答案 3 :(得分:0)

哦,原来我是个白痴。 Laravel中的where子句不比较两列,而应该使用whereColumn。早些时候,它正在将列“ due_date”的值与字符串“ completed_at”进行比较。现在我的新代码是-

        $completed_tasks_before = Task::where('assignee_id', $current_user->id)
                                        ->where('status','completed')
                                        ->whereColumn('due_date', '>=', 'completed_at')
                                        ->count();