我的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;
//当前日期
如何过滤结果集以仅返回尚未过期的行?
答案 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
,因为它可以精确地按字符串排序。