mysql - 在 MariaDB/MySql 的虚拟(计算)列中使用 UNIX_TIMESTAMP

标签 mysql mariadb unix-timestamp calculated-columns virtual-column

我正在尝试创建一个包含时间戳列和虚拟(计算)列的表,该列包含一个辅助键,用于对具有同一小时时间戳的行进行分组。为此,我在 MariaDB/MySql 中使用以下命令:

CREATE TABLE mytable(t TIMESTAMP, u INT AS (UNIX_TIMESTAMP(t) DIV 3600);

返回以下错误:

ERROR 1901 (HY000): Function or expression is not allowed for column 'u'

根据文档,我看不出这不起作用的原因。有什么想法吗?

最佳答案

替换这个...

(UNIX_TIMESTAMP(t) DIV 3600)

...有了这个...

(TIMESTAMPDIFF(HOUR,'1970-01-01 00:00:00',t))

已在 MariaDB 10.1.14 上验证,这应该适用于任何更高版本。

由于 UNIX_TIMESTAMP() 中的 1970-01-01 00:00:000,并且 DIV 3600 code> 是整数除法,您的表达式似乎相当于自 1970-01-01 00:00:00 以来的小时数 FLOOR()... 和 TIMESTAMPDIFF() 似乎提供了相同的值。

MariaDB 似乎将 UNIX_TIMESTAMP() 视为不确定性,这在提供参数时是不正确的。 MySQL 核心可能缺乏考虑“有时是确定性的”内置函数的能力,或者这可能是一个错误。

但我相信您可以使用 TIMESTAMPDIFF() 找到可行的解决方法。

另请注意,您似乎需要 PERSISTENT 关键字,否则无法对虚拟列建立索引,因为未存储该值。

ERROR 1901: Key/Index cannot be defined on a non-stored computed column

关于mysql - 在 MariaDB/MySql 的虚拟(计算)列中使用 UNIX_TIMESTAMP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43167009/

相关文章:

java - 异常 [EclipseLink-4003](Eclipse 持久性服务 - 2.3.0.v20110604-r9504):

python - 如何从 python 中执行加载数据命令

php - 上传前在 html 输入中显示所选文件

java - Hibernate - 无法加载请求的类 : org. mariadb.jdbc.Driver

python - 我无法弄清楚这个时间戳的含义

mysql - 使用 unix 纪元存储日期和日期时间

mysql - 使用MySQL判断今天是否是用户生日

mysql 多锁,单行

c# - 向Mysql插入数据越来越慢

mysql - 程序中的 if 语句有什么问题?