在MySQL数据库中,我有一个名为' mem_expire'其中包含格式为' 24/01/2010'的日期值。
我正在尝试使用一些条件语句来删除有效期少于预设时间变量的所有记录。这是我的代码,但我不确定我是否正确地使用它或是否可以在SQL查询中使用PHP函数?
代码: /删除过期会员
$oneyear = time() - (52 * 7 * 24 * 60 * 60);
$fiveyears = time() - (5 * 52 * 7 * 24 * 60 * 60);
$tenyears = time() - (10 * 52 * 7 * 24 * 60 * 60);
if (isset($_POST['delete'])) {
$delete = mysqli_real_escape_string($connection, $_POST['deleteold']);
if ($delete == '1') {
$deletequery = "DELETE FROM members WHERE" . strtotime('mem_expire') ." < $oneyear";
} elseif ($delete == '5') {
$deletequery = "DELETE FROM members WHERE" . strtotime('mem_expire') . "< $fiveyears";
} elseif ($delete == '10') {
$deletequery = "DELETE FROM members WHERE" . strtotime('mem_expire') . "< $tenyears";
}
$deleteresult = mysqli_query($connection, $deletequery);
}
你可以看到我想要做的事情,但我没有以正确的方式去做,有人能指出我正确的方向吗。任何帮助都是很好的帮助:)
答案 0 :(得分:0)
您可以在DELETE语句的WHERE子句中使用STR_TO_DATE
(另请参阅http://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_str-to-date)。所以这可以是这样的:
DELETE FROM members WHERE STR_TO_DATE(mem_expire, '%d/%m/%y') < somevalue
此外,MySQL中有INTERVAL
语法,这可能会派上用场。它允许您指定一个日期范围,该范围应从另一个相对值中减去。因此,您可以使用以下命令使命令更具可读性:
DELETE FROM members WHERE STR_TO_DATE(mem_expire, '%d/%m/%y') < DATE_SUB(now(), INTERVAL 1 YEAR);
在这样的日期案例中,http://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html总是值得一看......
注意:如果您的STR_TO_DATE()
表中有很多记录,则此member
的调用可能会变得非常昂贵。背景是DBMS系统需要执行全表扫描,因为没有索引可用于此。如果您的操作时间紧迫,您应该考虑@DanielHarris评论的内容:如果可能,请将数据类型更改为DATE
。或者,如果这会对整个编码的其余部分产生重大影响,则可以选择使用generated columns(仅适用于MySQL 5.7或更高版本)。
答案 1 :(得分:0)
假设ISO 8601的日期格式为yyyy-mm-dd
(php'Y-m-d'),并且有一个表示日期的php变量$mem_expire
(在适当的时间戳值中)。
php语句可以是:
$deletequery = "DELETE FROM members WHERE mem_expire < '" . date('Y-m-d', $mem_expire) . "'";