PHP中如何仅比较DateTime时间戳中的日期部分?
如何在SQL中比较DateTime列的日期部分?
嘿,我来帮你搞定这个DateTime日期比较的问题!你想要忽略DateTime列里的时间部分,只对比日期,之前的查询没生效可能是因为字符串转换的匹配问题,或者还有更高效的方案可以用。下面分情况给你几个可靠的解决办法:
针对SQL Server(你当前用的CONVERT属于SQL Server语法)
方案1:用日期范围查询(推荐,效率更高)
直接把查询条件设置为目标日期的00:00:00到次日的00:00:00,这样既能精准匹配当天所有时间的记录,还能利用DDateTime列的索引,比字符串转换效率高很多:
$sql = "SELECT * FROM ride WHERE RideFrom = '$RideFrom' AND RideTo = '$RideTo' AND DDateTime >= '14-05-2018' AND DDateTime < DATEADD(day, 1, '14-05-2018');";
这个逻辑是筛选出DDateTime在2018-05-14 00:00:00到2018-05-15 00:00:00之间的所有记录,完美覆盖当天的任何时间点。
方案2:直接转换为日期类型(比转字符串更可靠)
如果你还是想用类型转换的方式,别转成varchar,直接把DDateTime和输入日期都转成date类型,这样就不会有格式匹配的问题了:
$sql = "SELECT * FROM ride WHERE RideFrom = '$RideFrom' AND RideTo = '$RideTo' AND CONVERT(date, DDateTime) = CONVERT(date, '14-05-2018');";
如果你用的是MySQL
MySQL有更简洁的日期处理函数,直接用DATE()提取日期部分:
$sql = "SELECT * FROM ride WHERE RideFrom = '$RideFrom' AND RideTo = '$RideTo' AND DATE(DDateTime) = '2018-05-14';";
同样,推荐用范围查询来提升效率:
$sql = "SELECT * FROM ride WHERE RideFrom = '$RideFrom' AND RideTo = '$RideTo' AND DDateTime >= '2018-05-14' AND DDateTime < '2018-05-15';";
重要提醒:避免SQL注入!
你现在直接把变量$RideFrom、$RideTo拼到SQL语句里,非常容易遭遇SQL注入攻击,这是很危险的做法。强烈建议用参数化查询,比如PHP里的PDO或者mysqli预处理语句,举个PDO的例子:
// 初始化PDO连接 $pdo = new PDO('sqlsrv:Server=localhost;Database=your_db', 'username', 'password'); // 准备预处理语句 $stmt = $pdo->prepare("SELECT * FROM ride WHERE RideFrom = :rideFrom AND RideTo = :rideTo AND DDateTime >= :startDate AND DDateTime < :endDate"); // 设置参数 $targetDate = '14-05-2018'; $startDate = $targetDate; $endDate = date('d-m-Y', strtotime($targetDate . ' +1 day')); // 计算次日日期 // 绑定参数并执行 $stmt->bindParam(':rideFrom', $RideFrom); $stmt->bindParam(':rideTo', $RideTo); $stmt->bindParam(':startDate', $startDate); $stmt->bindParam(':endDate', $endDate); $stmt->execute(); // 获取结果 $rides = $stmt->fetchAll(PDO::FETCH_ASSOC);
参数化查询会自动处理变量的转义,彻底避免SQL注入风险,同时代码也更规范。
内容的提问来源于stack exchange,提问作者Leet Hudka
相关产品推荐
相关产品推荐

