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

pxiryf3j  于 2021-06-21  发布在  Mysql
关注(0)|答案(2)|浏览(416)

我的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; //当前日期
如何筛选结果集以仅返回尚未过期的行?

kknvjkwl

kknvjkwl1#

坏消息是:您的代码受到了糟糕数据库设计的影响。如果要存储日期值,请不要将其存储在日期类型列以外的任何列中。
好消息是:即使你不修复你的数据库结构(你真的,真的应该),你也不需要任何php来让你的查询工作。事实上,您甚至不需要使用准备好的语句,因为没有要包含的变量。
代码:(sqlfiddle演示)

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

这将产生所有尚未过期的折扣行(按日期排序)。
您可能会注意到:
你不需要重新格式化 expirydateORDER BY 子句,因为它被精确地排序为字符串。
我可以很容易地调用replace()而不是str -to -date(),将逗号分隔的日期格式化为连字符分隔的日期。
date\u format()将为您在结果集中设置日期格式提供极大的灵活性,这样您的php就可以进行较少的处理。

yv5phkfx

yv5phkfx2#

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

相关问题