我有这段代码, - 创建一个文件夹 - 创建一个备份文件 - 从数据库中删除所有数据,从当前日期起7天之前
他们要求我做出改变: - 给定14天的时间,将所有数据从8天删除到14天
或者更确切地说,如果今天是2019/04/08,选择2019/03/25之后的两周,它会消除2019/03/31之后的所有内容,并在数据库中留下从2019/04/01到2019年的所有内容。现在的日期(2019/04/08)
然后它会在两周内从8天到14天删除所有前一个,并在数据库中留下从当前日期到7天之前的所有内容。
我知道这件事是用beetween完成的,但是我无法正确编写查询
<?php
$databaseHost = 'xxx';
$databaseName = 'xxx';
$databaseUsername = 'xxx';
$databasePassword = 'xxx';
$connessione = mysqli_connect($databaseHost, $databaseUsername, $databasePassword, $databaseName);
$query = $connessione->query("
SELECT *
FROM utenti
WHERE data_password < DATE_SUB(NOW(), INTERVAL 7 DAY)
");
$results = $query->fetch_all(MYSQLI_ASSOC);
$ok = json_encode($results);
function makeDirectory($path, $mode)
{
// this creates if not exist
if (!is_dir($path)) {
return mkdir($path, $mode, true);
} else {
echo $path . " already exist!";
}
}
$path = 'backup_LOG';
$mode = 0777;
// or you can add here that if exist does not call the function makeDirectory
if (!is_dir($path)) {
$risultato = makeDirectory($path, $mode);
}
$fileName = 'backup_LOG/backup_file_' . date('Y_m_d') . '.txt';
$file = fopen($fileName, 'a');
//$file = fopen($fileName, 'x+');
fwrite($file, $ok);
fclose($file);
if (count($results) > 0) {
$firstId = reset($results)['data_password'];
$lastId = end($results)['data_password'];
$stmt = $connessione->prepare("DELETE FROM utenti WHERE data_password < DATE_SUB(NOW(), INTERVAL 7 DAY)");
$stmt->bind_param('ii', $firstId, $lastId);
$stmt->execute();
}
?>
碰巧BETWEEN
不适合日期值,因为它在范围的末尾会得到一个错误的错误。试试这个查询。
DELETE
FROM utenti
WHERE data_password >= CURDATE() - INTERVAL 14 DAY
AND data_password < CURDATE() - INTERVAL 7 DAY
这个WHERE
条款接受十四天前午夜或之后的每个日期值,以及午夜之前 - 七天前第一个时刻之前的每个日期值。
因此,如果今天是2019年3月16日,它将采取data_password
值2018-03-02 00:00
到2019-03-08 23:59:59.9999
的所有内容。
为了使其正常工作,列的数据类型必须是DATE
,DATETIME
或TIMESTAMP
。列上的索引可以使查询非常快。
如果您想删除比14天前更新的项目,您可以使用NOW()
代替CURDATE()
。
DELETE FROM utenti WHERE data_password > DATE_SUB(NOW(), INTERVAL 14 DAY) AND data_password < DATE_SUB(NOW(), INTERVAL 7 DAY);
此外,我不确定你的列名是否正确:data_password
但不管我怎么做。
如果data_password包含如下日期,您可能还需要将data_password强制转换为日期:
DATE(data_password) > ...