首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >sqlalchemy timedelta属性

sqlalchemy timedelta属性
EN

Stack Overflow用户
提问于 2013-08-19 05:39:25
回答 1查看 4.5K关注 0票数 4

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

为此,我可以使用Interval类型。我的数据库是SQLite,我不太理解文档中的描述:

代码语言:javascript
复制
"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)."

有人能告诉我该怎么做吗?

EN

回答 1

Stack Overflow用户

发布于 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

你甚至可以自己做:

代码语言:javascript
复制
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

代码语言:javascript
复制
interval = IntervalItem(interval=delta)
session.add(interval)
i = session.query(IntervalItem).first()
print "Timedelta from database:", i.interval

您可以看到它与上面的示例没有什么不同,只是它遍历了数据库。记住这一点的唯一一件事是这个注释:

代码语言:javascript
复制
Note that the Interval type does not currently provide date arithmetic operations 
on platforms which do not support interval types natively.

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18303924

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档