You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

时间戳转日期后按日期匹配查询用户详情无结果求助

问题排查与修复方案

嘿,我帮你梳理了这段代码里的问题,这几个点是导致你查不到数据的核心原因:

1. 变量类型被错误覆盖,时间戳变日期字符串

你一开始定义的$beginTimeStamp和$endTimeStamp是数字类型的时间戳(比如1524853800),但后续执行了这段代码:

$beginTimeStamp = date('Y-m-d', strtotime($beginTime . ' +1 day'));

这直接把原本的时间戳变量改成了YYYY-MM-DD格式的字符串,拼到SQL里就变成了created_at >=2018-04-29——SQL会把这个当成数值计算(2018减4减29),完全不是你想要的日期比较逻辑,自然查不到数据。

2. 日期转换逻辑冗余且易出错

你本来已经有原始时间戳了,完全不需要先转成日期字符串,再用strtotime重新解析加一天,直接对时间戳做秒数加减更准确:一天等于86400秒,直接给时间戳加86400就能得到次日同一时间的时间戳。

3. 存在SQL注入风险+语法错误

直接把变量拼到SQL语句里是非常危险的操作,而且你现在的变量变成字符串后没有加单引号,SQL会直接报错或者逻辑混乱。Laravel提供了参数绑定的方式,一定要用这个来避免问题。


修正后的代码示例

这里给你两种可行的修复方案,选适合你的就行:

方案1:使用原生SQL+参数绑定

$beginTimeStamp = 1524853800; // 注意这里是数字类型,不要加引号
$endTimeStamp = 1525717800;

// 把时间戳转成数据库能识别的datetime格式字符串
$beginDate = date('Y-m-d H:i:s', $beginTimeStamp);
// 结束时间加一天:直接给原始时间戳加86400秒
$endDate = date('Y-m-d H:i:s', $endTimeStamp + 86400);

// 用参数绑定避免SQL注入,同时保证语法正确
$userDetails = DB::select('SELECT * from users where created_at >= ? AND created_at < ?', [$beginDate, $endDate]);

方案2:更简洁的Laravel查询构造器写法

$beginTimeStamp = 1524853800;
$endTimeStamp = 1525717800;

$userDetails = DB::table('users')
    ->where('created_at', '>=', date('Y-m-d H:i:s', $beginTimeStamp))
    ->where('created_at', '<', date('Y-m-d H:i:s', $endTimeStamp + 86400))
    ->get();

如果你的created_at字段是timestamp类型,甚至可以直接用时间戳比较,省去日期转换步骤:

$userDetails = DB::table('users')
    ->where('created_at', '>=', $beginTimeStamp)
    ->where('created_at', '<', $endTimeStamp + 86400)
    ->get();

内容的提问来源于stack exchange,提问作者Maneesh Rao

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 11:04:55