4

我需要在表格的列中保存时间间隔。基于:http ://docs.sqlalchemy.org/en/rel_0_8/core/types.html

我可以为此使用间隔类型。我的数据库是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)."

谁能告诉我该怎么做?

4

1 回答 1

2

因此,从我在问题中得到的信息来看,您只想存储一个间隔并将其从数据库中取出以再次使用它?但是您想了解它是如何存储的吗?

关于存储:使用 Unix 时间戳可能比使用 DateTimes 更容易。假设您要存储timedelta(1),即一天的增量。存储在数据库中的是自“纪元”以来的时间,即 Unix 时间戳中的第二个“0”和日期:(1970-01-01 00:00:00这是 Unix 时间戳开始计算秒数的地方)。如果您不了解纪元或时间戳,请阅读Wikipedia on Unix time

所以我们想存储一天的差异?该文档声称它存储了“自纪元以来的时间”。我们刚刚了解到“纪元”是“秒 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.

两天四小时三十秒?: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

如您所见,计算很简单,这就是在幕后完成的所有工作。看看这个完整的例子

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.

这意味着你应该小心你如何使用它,例如在查询中添加可能不是一个好主意,但你应该只是玩弄它。

于 2013-08-19T12:59:01.877 回答