SQLite 文档指定在数据库中存储日期时间值的首选格式是使用 Julian Day(使用内置函数)。
但是,我在 python(pysqlite、SQLAlchemy)中看到的所有框架都将datetime.datetime
值存储为 ISO 格式的字符串。他们为什么这样做?
我通常会尝试调整框架以将日期时间存储为 julianday,这非常痛苦。我开始怀疑这是否值得努力。
请与我分享您在该领域的经验。坚持 julianday 有意义吗?
SQLite 文档指定在数据库中存储日期时间值的首选格式是使用 Julian Day(使用内置函数)。
但是,我在 python(pysqlite、SQLAlchemy)中看到的所有框架都将datetime.datetime
值存储为 ISO 格式的字符串。他们为什么这样做?
我通常会尝试调整框架以将日期时间存储为 julianday,这非常痛苦。我开始怀疑这是否值得努力。
请与我分享您在该领域的经验。坚持 julianday 有意义吗?
Julian Day 对于各种日期计算都很方便,但它可以很好地存储时间部分(精确的小时、分钟和秒)。在过去,我使用了 Julian Day 字段(用于日期)和秒数(datetime
例如),但仅当我有特定的计算需求(日期和时间)时。我认为 ISO 格式日期和日期时间的简单性应该使它们成为首选,比如大约 97% 的时间。
以两种方式存储它。可以按照自己的方式设置框架,如果您希望找到一个带有 ISO 格式字符串的原始列,那么这可能比它的价值更难解决。
拥有两列的问题是数据一致性,但 sqlite 应该具备使其工作所需的一切。3.3 版支持检查约束和触发器。阅读日期和时间功能。您应该能够完全在数据库中执行您需要的操作。
CREATE TABLE Table1 (jd, isotime);
CREATE TRIGGER trigger_name_1 AFTER INSERT ON Table1
BEGIN
UPDATE Table1 SET jd = julianday(isotime) WHERE rowid = last_insert_rowid();
END;
CREATE TRIGGER trigger_name_2 AFTER UPDATE OF isotime ON Table1
BEGIN
UPDATE Table1 SET jd = julianday(isotime) WHERE rowid = old.rowid;
END;
如果你不能在数据库中做你需要的事情,你可以编写一个 C 扩展来执行你需要的功能。这样,除了加载扩展程序之外,您不需要接触框架。
但通常,人类不会直接从数据库中读取数据。儒略日的小数时间很容易转换为人类可读的(例如)
void hour_time(GenericDate *ConvertObject)
{
double frac_time = ConvertObject->jd;
double hour = (24.0*(frac_time - (int)frac_time));
double minute = 60.0*(hour - (int)hour);
double second = 60.0*(minute - (int)minute);
double microsecond = 1000000.0*(second - (int)second);
ConvertObject->hour = hour;
ConvertObject->minute = minute;
ConvertObject->second = second;
ConvertObject->microsecond = microsecond;
};
因为2010-06-22 00:45:56
人类阅读比2455369.5318981484
. 文本日期非常适合在 SQLiteSpy 或 SQLite Manager 中进行临时查询。
当然,主要缺点是文本日期需要 19 个字节而不是 8 个字节。