【问题标题】:Mysql Delete and TimestampMysql 删除和时间戳
【发布时间】:2018-06-08 20:42:10
【问题描述】:

我正在寻求有关 MySQL 的帮助,非常简单的问题,但确实让我的大脑崩溃了一段时间。

我有一个名为“日志”的表,其中有“日期”的东西,即时间戳的 INT(11),因此,它使用实际的时间戳。

我要编写一个脚本,每分钟执行一条 SQL 命令,检查所有行,如果“日期”超过/等于 6 小时,我太累了,没有任何帮助。

我用过的一些命令不起作用。

DELETE FROM logs WHERE date < UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 6 HOUR));
DELETE FROM logs WHERE date < NOW() - INTERVAL 6 HOUR;

帮不了,所以,我在这里问你是否可以帮助我,谢谢。

【问题讨论】:

  • 'INT(11) of Timestamp' 是什么意思?
  • 为什么不使用真正的TIMESTAMP 数据类型?
  • 如果date 列包含数字时间戳,那么第一个查询应该可以工作。
  • 将问题描述为“行不通”对于提供有意义的信息几乎毫无用处。查询返回是否影响 0 行?是否删除了不应该删除的行?它是否返回错误?它在什么方面不起作用?

标签: mysql date timestamp delete-row


【解决方案1】:

你可以这样做:

DELETE FROM logs
WHERE FROM_UNIXTIME(date) < UNIX_TIMESTAMP(NOW() - INTERVAL 6 HOUR);

【讨论】:

    【解决方案2】:

    日期“事物”称为列。该列具有特定的数据类型。该问题表明该列是数据类型INT(11)。并且在该列中存储自 1970-01-01 UTC 以来的 unix 样式的 32 位整数秒数。

    如果这一切都是真的,那么第一个查询表单是合适的。右侧的表达式(小于比较)返回整数秒数。

    作为一个演示,考虑这个表达式:

    SELECT UNIX_TIMESTAMP( NOW() + INTERVAL -6 HOUR )   ==> 1528450555
    

    或者,原文的写法

    SELECT UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 6 HOUR))  
    

    返回等效结果。


    可以评估第二个查询,但从 DATETIME 到数字的自动转换将返回一个整数值,如 20180608153555(即 yyyymmddhhmmss),而不是从纪元开始以来的秒数。

    考虑一个演示,在数字上下文中评估 DATETIME 数据类型:

    SELECT NOW() + INTERVAL -6 HOUR + 0  ==>  20180608153600
    

    如果我们使用该表达式,将其与 INT(11) 列进行比较,并删除所有 INT(11) 列小于该值的行,它将删除表中具有非该列中的 NULL 值。

    【讨论】:

      【解决方案3】:

      您的日期列必须是 Type TIMESTAMP 而不是 INT 以便能够正确地相互比较时间戳,或者您可以编写:

      DELETE FROM logs WHERE FROM_UNIXTIME(date) < UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 6 HOUR));
      

      【讨论】:

      • 但是 MySQL 确实会进行自动类型转换。并且可以比较整数值。我们(通常)不希望将整数值(32 位 unix 样式的秒数)与 DATETIME 列进行比较。将 DATETIME 自动转换为数字有效,但它返回的数字类似于 yyyymmddhhmmss,而不是unix 风格的秒数。在FROM_UNIXTIME 中包装一个整数表达式确实会将整数转换为一个值,但我们(通常)不希望将其与 UNIX_TIMESTAMP 的返回值进行比较。这个答案是一个摇摆和错过。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-27
      • 1970-01-01
      相关资源
      最近更新 更多