2012-08-07 31 views
3

我正在使用本地sqlite數據庫在我的應用程序中對元數據進行離線處理,並且元數據包括時間戳。sqlite - python檢索CURRENT_TIMESTAMP作爲日期時間對象

我有一個表聲明如下:

CREATE TABLE if not exists tbl_dbsync_meta (
      maindb_last_checked TIMESTAMP, 
      global_scores_last_checked TIMESTAMP, 
      localscores_syncup_last_checked TIMESTAMP) 

現在,在一個點上,我從sqlite的檢索CURRENT_TIMESTAMP與上述所有其它時間戳一起,從而爲 - 自然 - 找出在時間的差異從現在到所有其他時間戳。

SELECT CURRENT_TIMESTAMP as this_time, * FROM tbl_dbsync_meta 

現在的問題是,所有其他字段被正確地檢索爲Python中的「datetime」對象。但CURRENT_TIMESTAMP作爲字符串返回。

我試圖鑄造CURRENT_TIMESTAMP

SELECT CAST(CURRENT_TIMESTAMP AS TIMESTAMP), * FROM tbl_dbsync_meta 

但現在它正在返回一個整數,所有這一切回來是今年(2012年)。

解決這個問題的一個簡單方法就是直接從來自sqlite本身的時間差異,而不是將它們檢索到python然後再玩。另一個選擇是我使用由CURRENT_TIMESTAMP返回的字符串,將它轉換爲Python到「日期時間」並使用它。

但是我需要了解CURRENT_TIMESTAMP(cast或其他)與其他TIMESTAMP字段之間的區別是什麼。這似乎是錯誤的,這是行不通的。

感謝您的幫助。

P.S:請注意,我從不將Python datettime對象直接存儲到SQLite中。任何時候我需要更新這張表,我只是SET global_scores_last_checked = CURRENT_TIMESTAMP。我只需要將SQLite中的日期轉換爲Python。

+0

我有detect_types=sqlite3.PARSE_DECLTYPES設置btw – 2012-08-07 06:28:19

+0

這似乎是一般'功能'的問題。我試過 - SELECT(CURRENT_TIMESTAMP - maindb_last_checked)FROM tbl_dbsync_meta。這也給我返回了一個Unicode字符串,而不是DATETIME對象。而如果我只選擇現有的TIMESTAMP字段(如「maindb_last_checked」),它將返回一個日期時間對象.......是這個問題嗎? – 2012-08-07 08:00:46

+0

您是如何將Python'datetime'對象存儲到時間戳列中的?他們如何轉換?請張貼一些Python代碼。 – 2012-08-07 08:33:02

回答

2

您需要設置PARSE_COLNAMES連接時:

sqlite3.connect(':memory:', detect_types=sqlite3.PARSE_COLNAMES)

然後下面的工作:

select current_timestamp as 'ts [timestamp]'

這將返回"2012-08-07 13:20:42" (<type 'datetime.datetime'>)

CAST不起作用(很可能是一個bug),CURRENT_TIMESTAMP確實沒有返回datetime類型,這可能是一個bug或一個特性(記住,Sqlite沒有日期/時間類型的概念,它將它們存儲爲TEXT/REAL /整數)。

+0

這是(字面上)幾年後,我很抱歉,我不記得當時爲什麼我沒有迴應這個答案 - 幾個疑問。首先,「SET column_name = CURRENT_TIMESTAMP」然後讀取該列與「SELECT CURRENT_TIMESTAMP」之間的區別是什麼?因爲我在第一種情況下得到了一個日期 - 時間對象。這可能是一個像你提到的錯誤嗎?第二個問題 - 我的SQL語法知識是生鏽的 - 「ts [timestamp]」中的「timestamp」應該表示查詢中返回的「virtual」「ts」列的數據類型? – 2014-10-09 13:42:10

相關問題