2013-08-18 94 views
3

我需要在表中的列中保存時間間隔。基於:http://docs.sqlalchemy.org/en/rel_0_8/core/types.htmlsqlalchemy timedelta屬性

我可以使用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)." 

有人可以告訴我該怎麼做嗎?

回答

1

因此,根據我在問題中得到的結果,您只需要存儲間隔並將其從數據庫中取出以再次使用它?但是你想了解它是如何存儲的?

關於存儲: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

兩天四小時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. 

這意味着你要小心你如何使用它,例如除了在查詢可能不是一個好主意,但你應該只玩與它在一起。