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

时间:2018-04-21 08:27:23

标签: php mysql date filtering date-formatting

我的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; //当前日期

的记录,它也会获取所有行

如何过滤结果集以仅返回尚未过期的行?

2 个答案:

答案 0 :(得分:0)

使用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;

答案 1 :(得分:0)

这是个坏消息:您的代码正遭受不良数据库设计的影响。如果要存储日期值,请不要将其存储在日期类型列以外的任何地方。

这是个好消息:即使您不修复数据库结构(您确实应该),也不需要任何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

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

您可能会注意到:

  • 您无需在expirydate子句中重新格式化ORDER BY,因为它可以精确地按字符串排序。
  • 我可以很容易地调用REPLACE()而不是STR_TO_DATE()来将逗号分隔的日期设置为连字符分隔的格式。
  • DATE_FORMAT()将为您提供格式化结果集中日期格式的极大灵活性,从而使您的php可以减少处理。