删除当前日期和上周之间的记录-间隔14天

时间:2019-04-08 15:35:32

标签: php mysql sql datetime

我有这段代码, -建立资料夹 -创建备份文件 -从当前日期开始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 :(得分:0)

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

答案 1 :(得分:0)

碰巧BETWEEN不适合日期值,因为它在范围的末尾出现了一个错误的错误。试试这个查询。

DELETE 
 FROM utenti 
WHERE data_password >= CURDATE() - INTERVAL 14 DAY
  AND data_password < CURDATE() - INTERVAL 7 DAY

WHERE子句接受14天前午夜或之后的每个日期值,以及七天前的午夜之前(在第一时刻之前)的每个日期值。

因此,如果今天是2019年3月16日,它将使用data_password值在2018-03-02 00:002019-03-08 23:59:59.9999范围内的所有内容。

为使其正常工作,列的数据类型必须为DATEDATETIMETIMESTAMP。列上的索引可以使查询非常快。

如果您要删除从14天前开始更新的项目,可以使用NOW()代替CURDATE()