Как лучше всего вычислить день недели?

У меня есть данные временных рядов с меткой времени ТЕКСТ в формате DD.MM.YYYY HH:mm:ss.sss (.sss = мс). Я извлекаю каждый компонент из поля метки времени ТЕКСТ и составляю метку времени в формате 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
);

Как создать вычисляемый столбец, в котором будет храниться день недели, в который попадает каждая временная метка строки?


1
57
1

Ответ:

Решено

Как и в комментарии, вам нужно заключить круглые скобки.

Кроме того, вы передаете неправильный аргумент.

gen_wkd INT GENERATED ALWAYS AS (strftime('%w', gen_ISODate)) STORED,

Множественный конкат format + может быть всего лишь одним вызовом, и, судя по выводу explain, такой вывод может быть более эффективным:

printf('%04d-%02d-%02d %02d:%02d:%02d.%03d',
       gen_year, gen_month, gen_day,
       gen_hr, gen_min, gen_sec, gen_ms)

(Если вы имеете в виду ISO 8601, разве пробел не должен быть T?)