gpt4 book ai didi

php - 编写一个可选地只显示日期之间的记录的查询

转载 作者:太空宇宙 更新时间:2023-11-03 10:42:50 25 4
gpt4 key购买 nike

我正在编写一个 MySQL 查询作为 Laravel 项目的一部分,它将允许我只返回匹配特定条件的记录。

对于这个解决方案,我有以下数据库迁移:

Schema::create('slides', function (Blueprint $table) {
$table->increments('id');
$table->integer('order')->default(0);
$table->boolean('enabled')->default(0);
$table->dateTime('start')->nullable();
$table->dateTime('end')->nullable();
});

理论上,这将按如下方式查询(这不是正确的 SQL!):

SELECT * FROM slides
IF enabled == 1
IF start IS NOT NULL
Only return the record if the current timestamp is after start
IF end IS NOT NULL
Only return the record if the current timestamp is before end
ORDER BY order ASC

重要的是要记住,开始和结束都不依赖于另一个 - 我可以设置一个开始日期和没有结束日期,并让它从开始日期无限期地出现。这同样适用于结束日期。

我有一些工作代码,改编自当前的答案,它似乎工作正常,但看起来很复杂:

SELECT *
FROM slides
WHERE `enabled` = 1
AND ((`start` < NOW() AND `end` > NOW()) OR (`start` IS NULL AND `end` > NOW()) OR (`start` < NOW() AND `end` IS NULL) OR (`start` IS NULL AND `end` IS NULL))
ORDER BY `order`

跟进在 Spencer 的解决方案(公认的解决方案)的帮助下,我成功地创建了 Eloquent 代码,使我能够执行此查询。作为引用,这里是:

$slides = Slide::where('enabled', true)
->where(function($query) {
return $query->where('start', '<', Carbon::now()->toDateTimeString())
->orWhereNull('start');
})
->where(function($query) {
return $query->where('end', '>', Carbon::now()->toDateTimeString())
->orWhereNull('end');
})
->orderBy('order', 'asc')
->get();

最佳答案

@strawberry 已经在他的评论中提到了它,但没有人注意到它:

select * from slides where
coalesce(start,'1900-1-1')<now()
and coalesce(end,'3000-12-31')>now()

'1900-1-1' 等所选日期应该被选为任何预期日期的“之前”和“之后”。

这样,只有在日期实际具有值时才会进行有意义的日期比较。

关于php - 编写一个可选地只显示日期之间的记录的查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35514278/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com