如何通过比较格式错误的日期字符串和今天的日期来过滤结果集行?

How to filter resultset rows by comparing malformed date string and today's date?

我的 mysql 数据库中有一个 VARCHAR 列,它用逗号而不是连字符存储日期。

我想通过将这些日期与当前日期进行比较来获取一些数据。要获取当前日期,我使用 php5 方法 date("Y,m,d"); 并将其声明为 $date;

如果当前日期小于给定行的日期,那么我想检索它,否则从结果集中忽略它。

这是我的代码

$date=date("Y,m,d"); //current date to check if expiry date is valid or not
try {
    $conn = new PDO("mysql:host=******;dbname=******", $username, "******");
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $query = "select id, discount, expirydate, description, logouploader from table WHERE expirydate>= ? LIMIT 10";
    $statement = $conn->prepare($query);
    $statement->execute(array($date));
    foreach($statement->fetchAll(PDO::FETCH_ASSOC) as $row) {
        echo $row['expirydate'];
    }  
}
catch(PDOException $e)
{
    echo "Connection failed: " . $e->getMessage();
}
$conn = null;

我的代码不比较日期;它获取所有行,即使它应该保留那些小于 $date; // 当前日期

的记录

如何将我的结果集过滤为仅 return 行尚未过期?

使用 explode 将您的日期字符串转换为数组,然后重新组合您的日期字符串。

function convertDateString($dateString){

  $dateArray = explode(',', $dateString);

  return date('Y-m-d', strtotime($dateArray[0] . '-' . $dateArray[1] . '-' . $dateArray[2]));

}


$date= date('Y-m-d'); //current date to check if expiry date is valid or not
try {
$conn = new PDO("mysql:host=******;dbname=******", $username, "******");
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$query = "select id, discount, expirydate, description, logouploader from table WHERE expirydate>= ? LIMIT 10";
$statement = $conn->prepare($query);
$statement->execute(array($date));
foreach($statement->fetchAll(PDO::FETCH_ASSOC) as $row) {

  if(strtotime($date) < strtotime(convertDateString($row['expirydate']))){

    echo $row['expirydate'];


  }else {

    //Do something else;

  }


}

}
catch(PDOException $e)
    {
        echo "Connection failed: " . $e->getMessage();
    }
    $conn = null;

这是个坏消息:您的代码受到不良数据库设计的影响。如果要存储日期值,切勿将它们存储在日期类型列以外的任何内容中。

好消息:即使你不修复你的数据库结构(你真的,真的应该),你也不需要任何php 让你的查询工作。事实上,您甚至不需要使用准备好的语句,因为没有要包含的变量。

代码:(SQLFiddle Demo)

SELECT discount,
       description,
       logouploader,
       DATE_FORMAT(STR_TO_DATE(expirydate, '%Y,%m,%d'), '%Y-%m-%d') AS `reformatted`
FROM `table`
WHERE STR_TO_DATE(expirydate, '%Y,%m,%d') >= CURDATE()
ORDER BY expirydate

这将产生所有尚未过期的折扣行(按日期排序)。

您可能会注意到:

  • 您不需要重新格式化 ORDER BY 子句中的 expirydate,因为它已准确排序为字符串。
  • 我本可以很容易地要求 REPLACE() instead of STR_TO_DATE() 将逗号分隔的日期格式化为连字符分隔的日期。
  • DATE_FORMAT() 将为您在格式化结果集中的日期方面提供极大的灵活性,以便您的 php 可以做更少的处理。