首页 > 解决方案 > 带有 DATEDIFF 和 DATETIME() 或 NOW() 的 MySQL(或 Mariadb)表达式

问题描述

这里有什么问题?

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 列来制作它。

标签: mysqlmariadb

解决方案


当前查询的问题在于它DATETIME是一种数据类型,而不是函数,因此您不能将其称为一个。DATETIME在该位置也无效,您需要使用NOW()CURDATE()依赖于您是否想要日期和时间的差异或只是日期。

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

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

推荐阅读