在SQLite中将DateTime数据存储为julianday会不会烦恼?

时间:2009-09-06 16:43:23

标签: python datetime sqlite sqlalchemy pysqlite

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

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

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

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

4 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:5)

以两种方式存储它。可以按照自己的方式设置框架,如果你的框架希望找到一个带有ISO格式字符串的原始列,那么这可能比它的价值更令人痛苦。

拥有两列的关注点是数据一致性,但sqlite应该拥有使其工作所需的一切。版本3.3支持检查约束和触发器。阅读date and time functions。您应该能够在数据库中完全满足您的需求。

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扩展来执行所需的功能。这样,除了加载扩展程序之外,您不需要触摸框架。

答案 2 :(得分:1)

但通常情况下,Human不会直接从数据库中读取数据。朱利安日的分数时间很容易通过(例如)

转换为人类可读的
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;

};

答案 3 :(得分:0)

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

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