我的时间序列数据的文本时间戳格式为
DD.MM.YYYY HH:mm:ss.sss
(.sss
= ms)。
我从 TEXT 时间戳字段中提取每个组件,并将 ISO 格式的时间戳组成为 YYYY-MM-DD HH:mm:ss.sss
。
我通读了关于 strftime
函数的文档,但以下内容不起作用:
CREATE TABLE tickdata (
DateTime TEXT, -- source format = "DD.MM.YYYY HH:mm:ss.sss"
class TEXT,
category TEXT,
upper INT,
lower INT,
diff INT GENERATED ALWAYS AS (upper - lower) STORED,
gen_year INT GENERATED ALWAYS AS (SUBSTRING(DateTime, 7, 4)) STORED,
gen_month INT GENERATED ALWAYS AS (SUBSTRING(DateTime, 4, 2)) STORED,
gen_day INT GENERATED ALWAYS AS (SUBSTRING(DateTime, 1, 2)) STORED,
gen_wkd INT GENERATED ALWAYS AS CAST(strftime('%w',DateTime) AS INT) STORED, -- syntax error
-- gen_wkd INT GENERATED ALWAYS AS strftime('%w',DateTime) STORED, -- also syntax error
-- gen_wkd CAST(strftime('%w',DateTime) AS INT) GENERATED ALWAYS STORED, -- also syntax error
gen_hr INT GENERATED ALWAYS AS (SUBSTRING(DateTime, 12, 2)) STORED,
gen_min INT GENERATED ALWAYS AS (SUBSTRING(DateTime, 15, 2)) STORED,
gen_sec INT GENERATED ALWAYS AS (SUBSTRING(DateTime, 18, 2)) STORED,
gen_ms INT GENERATED ALWAYS AS (SUBSTRING(DateTime, 21, 3)) STORED,
gen_ISODate TEXT GENERATED ALWAYS AS (
FORMAT('%04d', gen_year) || '-' ||
FORMAT('%02d', gen_month) || '-' ||
FORMAT('%02d', gen_day) || ' ' ||
FORMAT('%02d', gen_hr) || ':' ||
FORMAT('%02d', gen_min) || ':' ||
FORMAT('%02d', gen_sec) || '.' ||
FORMAT('%03d', gen_ms) -- format = "YYYY-MM-DD HH:mm:ss.sss"
) STORED
);
如何创建一个计算列来存储每行时间戳所属的星期几?
如评论中所示,您需要将括号括起来。
此外,你传递了错误的论点。
gen_wkd INT GENERATED ALWAYS AS (strftime('%w', gen_ISODate)) STORED,
多个
format
+ concat 可能只是一次调用,并且通过 explain
输出来判断,这样可能会更有效:
printf('%04d-%02d-%02d %02d:%02d:%02d.%03d',
gen_year, gen_month, gen_day,
gen_hr, gen_min, gen_sec, gen_ms)