2012-08-07 32 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

相关问题