【问题标题】:SQL Update record when field is in the past字段为过去时的 SQL 更新记录
【发布时间】:2021-03-16 18:10:39
【问题描述】:

如何设置字段“已发布”=0 字段 F12 中日期早于今天的所有记录?

很遗憾,F12 字段不是 DateTime 字段,而是一个字符串。不幸的是,我无法改变这一点。我必须先将字符串转换为日期。

很遗憾,这段代码不起作用

UPDATE 'mytable' 
SET 'published' = '0' 
WHERE STR_TO_DATE('F12', '%d.%m.%Y') DATEDIFF(day, 'F12', NOW()) >= 1

phpMyAdmin 的截图在这里:

非常感谢您的支持和问候

【问题讨论】:

    标签: php mysql sql mariadb


    【解决方案1】:

    我希望这样的逻辑:

    update mytable
        set published = 0
        where STR_TO_DATE(F12, '%d.%m.%Y') < curdate();
    

    请注意,单引号仅用于字符串常量。这可能是您的查询的问题。或者,您可能正在使用 now(),它具有时间组件,因此它还会更新日期为今天的值。

    【讨论】:

    • 其中 STR_TO_DATE(F12, '%d.%m.%Y') 是全表扫描,不能使用索引,MySQL 必须转换每个将日期字段转换为日期以进行比较
    • @Gordon:谢谢,它有效!使用单引号,我知道有什么问题,我使用单引号作为编辑器。我使用了以下代码: UPDATE mytable SET published = '0' WHERE STR_TO_DATE(F12, '%d.%m.%Y')
    • @Bernd:我怎样才能更有效地解决问题?
    • @fab - 唯一的方法是将字段更改为日期或时间戳并在其上设置索引
    • @fab - 我认为还有一种方法。您可以在自动存储 STR_TO_DATE(F12, '%d.%m.%Y') 的表中生成一个新的持久虚拟字段,并在该字段上设置索引。那么你可以比较 F12new
    【解决方案2】:

    这不是答案。它只是虚拟字段的一个示例:

    创建示例表

    CREATE TABLE `table1` (
      `a` int(11) NOT NULL,
      `F12` varchar(32) DEFAULT NULL,
      `F12new` date AS (STR_TO_DATE(`F12`, '%d.%m.%Y')) PERSISTENT,
    ) ENGINE=InnoDB DEFAULT CHARSET=UTF8;
    

    样本

    MariaDB [bernd]> CREATE TABLE `table1` (   `a` int(11) NOT NULL,   `F12` varchar(32) DEFAULT NULL,   `F12new` date AS (STR_TO_DATE(`F12`, '%d.%m.%Y')) PERSISTENT ) ENGINE=InnoDB DEFAULT CHARSET=UTF8;
    Query OK, 0 rows affected (0.19 sec)
    
    MariaDB [bernd]> insert into table1 (a,F12) VALUES (1,'1.2.2018');
    Query OK, 1 row affected (0.02 sec)
    
    MariaDB [bernd]> select * from table1;
    +---+----------+------------+
    | a | F12      | F12new     |
    +---+----------+------------+
    | 1 | 1.2.2018 | 2018-02-01 |
    +---+----------+------------+
    1 row in set (0.01 sec)
    
    MariaDB [bernd]> insert into table1 (a,F12) VALUES (1,'17.05.2029');
    Query OK, 1 row affected (0.01 sec)
    
    MariaDB [bernd]> select * from table1;
    +---+------------+------------+
    | a | F12        | F12new     |
    +---+------------+------------+
    | 1 | 1.2.2018   | 2018-02-01 |
    | 1 | 17.05.2029 | 2029-05-17 |
    +---+------------+------------+
    2 rows in set (0.00 sec)
    
    MariaDB [bernd]>
    

    现在你只在 F12new 上设置一个索引

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-15
      • 2018-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-20
      相关资源
      最近更新 更多