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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:38:56