SQLite docs指定在DB中存储日期时间值的首选格式是使用Julian Day(使用内置函数)。
但是,我在python中看到的所有框架(pysqlite,SQLAlchemy)都将datetime.datetime
值存储为ISO格式的字符串。他们为什么这样做?
我通常会尝试调整框架以将日期时间存储为julianday,这非常痛苦。我开始怀疑这是值得的。
请与我分享您在此领域的经验。坚持julianday有意义吗?
答案 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个字节。