0

タイムスタンプ列とタイムスタンプが同じ時間のグループを作成するヘルパーキーを保持する仮想(計算)列を持つテーブルを作成しようとしています。そのために私はMariaDB/MySQLで次のコマンドを使用しています:私はこれがうまくいかなければならない理由が表示されていない文書によるとMariaDB/MySqlの仮想(計算)列でUNIX_TIMESTAMPを使用

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

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

次のエラーを返します。何か案は?

答えて

0

これで... ...

(UNIX_TIMESTAMP(t) DIV 3600) 

これを交換してください...

MariaDB 10.1.14に検証
(TIMESTAMPDIFF(HOUR,'1970-01-01 00:00:00',t)) 

、これは、それ以降のバージョンで動作するはずです。 1970-01-01 00:00:00以来

UNIX_TIMESTAMP()0あり、そしてDIV 3600は、あなたの表現は、1970年1月1日00:00:00からの時間数のFLOOR()に相当すると整数除算思われる...とTIMESTAMPDIFF()が提供する表示されます同じ値。

MariaDBは、UNIX_TIMESTAMP()が非決定的であると思われます。引数が指定されている場合は正しくありません。 MySQLコアには、組み込み関数を「時には決定論的」と考える能力がないかもしれません。あるいは、バグかもしれません。

しかし、あなたはTIMESTAMPDIFF()を使用して実行可能な回避策があると思います。

また、値が格納されていないため、仮想列を索引付けできないため、PERSISTENTキーワードが必要です。

+0

このコードは、クライアントのタイムゾーンを考慮していないと思います。つまり、異なるクライアントで異なる値を得ることができます。 –

関連する問題