如何将PHP中date()返回值与数据库timestamp字段进行日期比较
解决方案
一、PHP生成日期与MySQL timestamp字段的比较方法
方法1:SQL日期函数转换(适合小数据量场景)
直接用MySQL自带的DATE()函数将timestamp字段转为日期格式,和PHP生成的日期直接匹配即可:
$current_date = date("Y-m-d"); $fetch_user_by_number = "SELECT id,transfer_amount,number FROM `transfer_wallet` WHERE `transfer_number`=:number AND DATE(`transaction_date`) = :current_date ORDER BY `transaction_date` DESC limit 1"; // 执行SQL时将$current_date绑定到:current_date参数即可
该方法写法简单,但DATE()函数会导致transaction_date字段的索引失效,数据量较大时查询性能较低。
方法2:时间区间匹配(推荐,可走索引)
将比较逻辑改为 timestamp 字段落在当日0点到次日0点的左闭右开区间,不会触发字段函数计算,可正常使用索引:
$today_start = date("Y-m-d 00:00:00"); $tomorrow_start = date("Y-m-d 00:00:00", strtotime("+1 day")); $fetch_user_by_number = "SELECT id,transfer_amount,number FROM `transfer_wallet` WHERE `transfer_number`=:number AND `transaction_date` >= :today_start AND `transaction_date` < :tomorrow_start ORDER BY `transaction_date` DESC limit 1"; // 执行SQL时绑定$today_start、$tomorrow_start两个参数即可
二、新数据插入触发推送的实现逻辑
单纯的日期比较只能匹配当日数据,要实现新数据插入即推送的需求,推荐用增量查询方案:
- 每次查询完成后,记录本次查询到的最大
id值(或者最新的transaction_date时间值),存储到缓存、配置文件或者服务内存中 - 下一次轮询查询时,新增条件
id > 上次记录的最大id(或者transaction_date > 上次记录的最新时间) - 如果查询返回结果不为空,说明有新增数据,直接调用APP推送服务对应用户发通知即可
如果对实时性要求不高,每隔几秒到几分钟轮询一次即可满足需求;如果需要强实时性,可以搭配数据库触发器+消息队列实现,数据插入时直接触发推送任务。
内容的提问来源于stack exchange,提问作者Ginxxx
相关产品推荐
相关产品推荐

