如何通过比较格式错误的日期字符串和今天的日期来过滤结果集行?
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 可以做更少的处理。
我的 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 可以做更少的处理。