gpt4 book ai didi

datetime - sqlalchemy timedelta 属性

转载 作者:行者123 更新时间:2023-12-02 01:58:51 27 4
gpt4 key购买 nike

我需要在表的一列中保存时间间隔。基于: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)."

谁能告诉我我该怎么做?

最佳答案

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

关于存储:使用 Unix 时间戳可能比使用日期时间更容易。假设您要存储 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 .

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

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

关于datetime - sqlalchemy timedelta 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18303924/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com