【问题标题】:Delete record beetween current date and last week - interval 14 days删除当前日期和上周之间的记录 - 间隔 14 天
【发布时间】:2019-04-08 15:35:32
【问题描述】:

我有这段代码,它 - 创建一个文件夹 - 创建备份文件 - 从数据库中删除当前日期前 7 天之前的所有数据

他们要求我进行更改: - 给定14天的时间段,删除8天到14天的所有数据

或者更确切地说,如果今天是 2019 年 4 月 8 日,请选择最多两周前 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();
    }
    ?>

【问题讨论】:

    标签: php mysql sql datetime


    【解决方案1】:

    碰巧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:002019-03-08 23:59:59.9999 范围内的所有内容。

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

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

    【讨论】:

      【解决方案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) > ...
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-05
        • 2022-01-12
        • 2013-12-25
        • 2021-12-21
        • 1970-01-01
        • 2016-10-13
        相关资源
        最近更新 更多