我想以毫秒为单位存储日期,但也希望看到它的格式化表示形式。为了不浪费驱动器空间,为此使用虚拟生成的列是有意义的。
我写的:
DROP TABLE IF EXISTS example;
CREATE TABLE IF NOT EXISTS example (
time INTEGER,
formatted_time GENERATED ALWAYS AS (strftime('%Y.%m.%d %H:%m', time/1000, 'unixepoch')) VIRTUAL
);
INSERT INTO example (time) VALUES (1605960000000);
INSERT INTO example (time) VALUES (1615413202000);它可以工作,但我不能设置strftime(format,timestring,modifier,modifier...)的第二个修饰符来获得本地时间。(默认情况下,它返回UTC时间。)
当我使用:
formatted_time GENERATED ALWAYS AS (strftime('%Y.%m.%d %H:%m', time/1000, 'unixepoch', 'localtime')) VIRTUAL当我插入数据时,它会抛出Result: non-deterministic use of strftime() in a generated column。
虽然它如预期的那样运作:
select strftime('%Y.%m.%d %H:%m', 1615413202000/1000, 'unixepoch', 'localtime');如何使用格式化的本地时间创建虚拟列?
发布于 2021-03-11 16:59:42
我是不可能。
根据这一答案:
生成列的值所需的deterministic).在任何时区的任何机器上都是相同的(be SQLite )。即使对于虚拟生成的列。
在我的例子中,对于在不同时区打开的同一个表,time值1615413202000的formatted_time将是不同的,因此该表将是“非确定性的”。
作为解决办法,可以创建一个视图
CREATE VIEW example_view AS
SELECT time, strftime('%Y.%m.%d %H:%m', time/1000, 'unixepoch', 'localtime') as formatted_time_local
FROM example;https://stackoverflow.com/questions/66573799
复制相似问题