Удалить запись между текущей датой и последней неделей — интервал 14 дней

#php #mysql #sql #datetime

#php #mysql #sql #дата и время

Вопрос:

У меня есть этот фрагмент кода, который — создать папку — создать файл резервной копии — удаляет из БД все данные до 7 дней с текущей даты

Они попросили меня внести изменения: — Учитывая период в 14 дней, удалите все данные с 8 дней до 14

Или, скорее, если сегодня 2019/04/08, выберите до двух недель назад 2019/03/25, это устраняет все, что происходит с 2019/03/31, и оставляет в БД все, что происходит с 2019/04/01 по текущую дату (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();
    }
    ?>
  

Ответ №1:

Бывает, что 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 дней назад.

Ответ №2:

 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) > ...