У меня есть этот кусок кода, который - создать папку - создать файл резервной копии - удаляет из БД все данные за 7 дней до текущей даты
Они попросили меня изменить: - Учитывая период 14 дней удалить все данные с 8 дня по 14
Или, если сегодня 2019/04/08, выберите до двух недель назад 2019/03/25, он удаляет все, что идет с 2019/03/31 и оставляет в БД все, что идет с 2019/04/01 до текущей даты (2019/04/08)
Потом удаляет все предыдущее за две недели с 8 дня до 14 и оставляет на бд все что идет от текущей даты до 7 дней до.
Я знаю, что это делается с between, но я не могу правильно написать запрос
<?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();
}
?>
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 как дату, если она содержит такую дату:
DATE(data_password) > ...
Бывает, что BETWEEN
не подходит для значений даты, потому что в конце диапазона выдает ошибку «отклонение на единицу». Попробуйте этот запрос.
DELETE
FROM utenti
WHERE data_password >= CURDATE() - INTERVAL 14 DAY
AND data_password < CURDATE() - INTERVAL 7 DAY
Это предложение WHERE
принимает любое значение даты в полночь или после полуночи четырнадцать дней назад и каждое значение даты до полуночи — до первого момента — семь дней назад.
Итак, если сегодня 16 марта 2019 года, он примет все со значением data_password
в диапазоне от 2018-03-02 00:00
до 2019-03-08 23:59:59.9999
.
Чтобы это работало правильно, тип данных столбца должен быть DATE
, DATETIME
или TIMESTAMP
. Индекс столбца может сделать запрос довольно быстрым.
Вы можете использовать NOW()
вместо CURDATE()
, если хотите удалить элементы, которые старше 14 дней.