我需要在表的列中保存时间间隔。基于:http://docs.sqlalchemy.org/en/rel_0_8/core/types.html
为此,我可以使用Interval类型。我的数据库是SQLite,我不太理解文档中的描述:
"The Interval type deals with datetime.timedelta objects. In PostgreSQL, the
native INTERVAL type is used; for others, the value is stored as a date which
is relative to the “epoch” (Jan. 1, 1970)."有人能告诉我该怎么做吗?
发布于 2013-08-19 20:59:02
因此,从我在问题中得到的结果来看,您希望只存储一个间隔,然后从数据库中取出它以便再次使用它?但是你想知道它是如何存储的吗?
关于存储:使用Unix时间戳可能比使用DateTimes更容易。假设您想要存储timedelta(1),即一天的增量。存储在数据库中的是自“纪元”以来的时间,即Unix时间戳中的第二个"0“和日期:1970-01-01 00:00:00 (这是Unix时间戳开始计秒的地方)。如果您不了解纪元或时间戳,请阅读Wikipedia on Unix time。
所以我们想存储一天的差异?文档声称它存储了“自纪元以来的时间”。我们刚刚了解到"epoch“是"second 0",所以一天后将是每分钟60秒,每小时60分钟,每天24小时:60 * 60 * 24 = 86400。因此,将其存储为整数很容易理解:如果您在数据库中找到值86400,则它表示1 day, 0 hours, 0 minutes, 0 seconds。
现实有点不同:它存储的不是整数,而是一个DateTime对象。从这个角度讲,时代是1970-01-01 00:00:00。那么,自纪元以来的一天的增量是什么?这很简单:它是1970-01-02 00:00:00。你可以看到,已经晚了一天了。
一小时后?1970-01-01 01:00:00。
2天4小时30秒?:1970-01-03 04:00:30。
你甚至可以自己做:
epoch = datetime.utcfromtimestamp(0)
delta = timedelta(1)
one_day = datetime.utcfromtimestamp(86400)
print "Date to be stored in database:", epoch + delta
print "Timedelta from date:", one_day - epoch正如您所看到的,计算很简单,这就是在幕后完成的所有工作。看一下这个full example
interval = IntervalItem(interval=delta)
session.add(interval)
i = session.query(IntervalItem).first()
print "Timedelta from database:", i.interval您可以看到它与上面的示例没有什么不同,只是它遍历了数据库。记住这一点的唯一一件事是这个注释:
Note that the Interval type does not currently provide date arithmetic operations
on platforms which do not support interval types natively.这意味着您应该小心如何使用它,例如,在查询中添加可能不是一个好主意,但您应该玩弄它。
https://stackoverflow.com/questions/18303924
复制相似问题