【问题标题】:MySQL (or Mariadb) Expression with DATEDIFF and DATETIME() OR NOW()带有 DATEDIFF 和 DATETIME() 或 NOW() 的 MySQL(或 Mariadb)表达式
【发布时间】:2019-12-09 22:40:48
【问题描述】:

这里有什么问题?

CREATE TABLE `actionAngebot` (
    `createdAt` DATETIME NOT NULL,
    `expiryDat` SMALLINT DEFAULT UNSIGNED AS (DATEDIFF(`createdAt`, DATETIME())) STORED
)
ENGINE=MyISAM;

SQL 错误 (1064):您的 SQL 语法有错误;检查 与您的 MySQL 服务器版本相对应的手册 在第 3 行的 '() )) STORED ) ENGINE=MyISAM' 附近使用的语法 *

请不要向我推荐这个:

CREATE TABLE `promos` (
    `createdAt` DATETIME NOT NULL,
    `createdTil` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    `expiryDateOfReward` SMALLINT(10) AS ((to_days(`createdAt`) - to_days(`createdTil`))) VIRTUAL
)
ENGINE=MyISAM;

我想用 2 列来制作它。

【问题讨论】:

    标签: mysql mariadb


    【解决方案1】:

    您当前查询的问题是DATETIME 是一种数据类型,而不是函数,因此您不能将其称为一个。 DATETIME 在该位置也无效,您需要使用 NOW()CURDATE(),具体取决于您想要更改日期和时间还是仅更改日期。

    但是

    您不能对包含基于系统日期和时间的函数的生成列使用表达式,因此您不能做您想做的事情(请参阅manual)。您可以考虑创建一个视图:

    CREATE VIEW aabot AS
    SELECT *, DATEDIFF(`createdAt`, NOW()) AS expiryDat
    FROM actionAngebot
    

    【讨论】:

    • 您的观点会给我查询时的时差吗?还是在更新表格的那一刻?
    • @HenryStack 它会给你查询时的时差。如果您在表格更新时想要它,那么除了您在问题中提到的第三列之外,您真的别无选择。
    • t0x    
    猜你喜欢
    • 1970-01-01
    • 2012-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-25
    • 2014-06-29
    • 1970-01-01
    • 2020-10-03
    相关资源
    最近更新 更多