8

SQLite 文档指定在数据库中存储日期时间值的首选格式是使用 Julian Day(使用内置函数)。

但是,我在 python(pysqlite、SQLAlchemy)中看到的所有框架都将datetime.datetime值存储为 ISO 格式的字符串。他们为什么这样做?

我通常会尝试调整框架以将日期时间存储为 julianday,这非常痛苦。我开始怀疑这是否值得努力。

请与我分享您在该领域的经验。坚持 julianday 有意义吗?

4

4 回答 4

6

Julian Day 对于各种日期计算都很方便,但它可以很好地存储时间部分(精确的小时、分钟和秒)。在过去,我使用了 Julian Day 字段(用于日期)和秒数(datetime例如),但仅当我有特定的计算需求(日期和时间)时。我认为 ISO 格式日期和日期时间的简单性应该使它们成为首选,比如大约 97% 的时间。

于 2009-09-06T17:10:49.327 回答
5

以两种方式存储它。可以按照自己的方式设置框架,如果您希望找到一个带有 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 扩展来执行你需要的功能。这样,除了加载扩展程序之外,您不需要接触框架。

于 2009-09-09T12:57:15.477 回答
1

但通常,人类不会直接从数据库中读取数据。儒略日的小数时间很容易转换为人类可读的(例如)

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;

};
于 2011-01-08T14:36:32.193 回答
0

因为2010-06-22 00:45:56人类阅读比2455369.5318981484. 文本日期非常适合在 SQLiteSpy 或 SQLite Manager 中进行临时查询。

当然,主要缺点是文本日期需要 19 个字节而不是 8 个字节。

于 2010-06-22T00:50:37.680 回答