在 SQLite 中根据今天的日期创建生成列

Ang*_*ood 4 python sqlite calculated-columns

我对 SQL 非常陌生,一直在尝试使用以下代码创建生成列。

c.execute("""CREATE TABLE students (
  --snip--
  level integer,
  date_last_visit integer, 
  days_since_visit integer GENERATED ALWAYS AS (DATE('now') - date_last_visit),
  urgency_rating integer GENERATED ALWAYS AS (days_since_visit * level) VIRTUAL,
  --snip--
)""") 
Run Code Online (Sandbox Code Playgroud)

days_since_visit 应该获取当前日期并从中减去一个日期

将数据添加到列时出现此错误: sqlite3.OperationalError: non-definiteistic use of date() in a generated column

Sha*_*awn 7

你不能。

根据文档,在限制部分:

生成列的表达式只能引用同一行中的常量文字和列,并且只能使用标量确定性函数。该表达式不能使用子查询、聚合函数、窗口函数或表值函数。

并从确定性函数的文档中:

SQLite 的内置日期和时间函数是一个特例。这些函数通常被认为是确定性的。但是,如果这些函数使用字符串“now”作为日期,或者使用 localtime 修饰符或 utc 修饰符,则它们被视为不确定。由于函数输入在运行时之前不一定已知,因此如果日期/时间函数在仅允许确定性函数的上下文中遇到任何非确定性功能,它们将引发异常。

但是,您可以做的是使用视图将这些列添加到基础真实表中。就像是:

CREATE TABLE student_data(level INTEGER, date_last_visit INTEGER, ...);
CREATE VIEW students AS
SELECT level, date_last_visit, DATE('now') - date_last_visit AS days_since_visit, ...
FROM student_data;
Run Code Online (Sandbox Code Playgroud)

但请注意,DATE()返回一个字符串并从字符串中减去一个整数并不能达到您想要的效果;我确信还有其他关于在 sqlite 中查找自给定时间以来的天数的问题。