Удалить запись между текущей датой и последней неделей - интервал 14 дней - PullRequest
0 голосов
/ 08 апреля 2019

У меня есть этот кусок кода, который - создать папку - создать файл резервной копии - удаляет из БД все данные до 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();
    }
    ?>

Ответы [ 2 ]

0 голосов
/ 08 апреля 2019

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

0 голосов
/ 08 апреля 2019
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) > ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...