聚合日期列时解析声明类型失败

2 投票
1 回答
1130 浏览
提问于 2025-04-20 07:24

我有一个SQLite数据库,在里面我把某些列的类型声明为日期(虽然SQLite实际上并没有日期这种类型,所以它会忽略这个声明)。我把日期存储为SQLite的日期字符串。

当我用Python连接这个数据库时,我传递了detect_types=sqlite3.PARSE_DECLTYPES这个参数。这样做的好处是,sqlite库能够正确识别哪些列是日期类型,并且当我从这些列读取数据时,它会给我一个date对象,而不是字符串。

不过,如果我对一个日期列进行聚合操作,我得到的结果是字符串,而不是日期:

 SELECT MIN(ReportDate) FROM PatientReports WHERE PatientID = ?;

这个操作返回的是字符串,而不是日期值。有趣的是,下面这个SQL:

 SELECT ReportDate FROM PatientReports WHERE PatientID = ? ORDER BY ReportDate DESC LIMIT 1;

能够正确返回一个日期值(这也是我现在使用的解决办法)。

问题是:有没有办法修改第一个SQL语句或者我的数据库定义,让Python能够保持日期的转换?

1 个回答

5

PARSE_DECLTYPES 这个功能只有在你直接使用某个列的值时才有效。如果你对这个值进行了一些处理,比如通过函数传递它,或者进行数学运算,或者简单地像这样写 +ReportDate,那么它原本的类型信息就会丢失。

这就意味着,实际上 PARSE_DECLTYPES 的用处并不大。

如果你真的想使用 Python 的类型转换功能,应该启用 PARSE_COLNAMES,并在需要的时候把类型加到列名里:

SELECT MIN(ReportDate) AS "ReportDate [date]" FROM ...

撰写回答