Laravel MySQL 时间查询问题
- Laravel 版本:7.30.6
- MySQL 版本:8.0.29-0ubuntu0.20.04.3 for Linux on x86_64
- Navcat 版本:Navicat Premium 15
在做一个商城 后台管理的时 偶然间发现订单查询不全(本身就两条数据 却只显示一条)遂记录一下
订单表 查询字段 :created_at 类型 timestamp
在 laravel 框架中 查询方式:
$GoodIndent = GoodIndent::whereRaw('now()-created_at<86400')->get();
在 6月 30号查询 应该是两条数据 结果只显示一条 早上3点的数据查不到
通过打印检查SQL 语句:
select * from `good_indents` where now()-created_at<86400(还有排除软删除的语法 不影响查询);
遂通过 Navcat 用SQL 语句查询 结果和 Laravel 中显示一样
在 7月1号再次查询:将数据库中的时间 改为如下结构:
查询到数据为空
将时间改为 3点 则可查询到一条数据
改变写法:
在 Navcat 中检测:
select * from `good_indents` where UNIX_TIMESTAMP(now())-UNIX_TIMESTAMP(created_at)<86400;
此时 能完整查询到 24小时内的 2 条数据
在 Laravel 中 改变写法:
$s=date("Y-m-d");
$e=date("Y-m-d "."23:59:59");
$GoodIndent = GoodIndent::whereBetween("created_at",[$s,$e])->get();
此时能查询到7月1号的1条数据
查找问题:
通过SQL语句:
SELECT now()-created_at from `good_indents`
改变写法:
SELECT UNIX_TIMESTAMP(now())-UNIX_TIMESTAMP(created_at) from `good_indents`
综上 Mysql 在timestamp类型字段的查询中 存在和我们开发者理解上的转换差异 所以在开发过程中 应当注意 此类情况 防止钻牛角尖