【问题标题】:sqlite - python Retrieve CURRENT_TIMESTAMP as datetime objectsqlite - python 检索 CURRENT_TIMESTAMP 作为日期时间对象
【发布时间】:2012-08-04 03:19:16
【问题描述】:

我正在使用本地 sqlite 数据库对我的应用程序中的元数据进行离线处理,元数据包括时间戳。

我有一个表声明如下:

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 中的“日期时间”对象。但是 CURRENT_TIMESTAMP 以字符串形式返回。

我尝试投射CURRENT_TIMESTAMP

SELECT CAST(CURRENT_TIMESTAMP AS TIMESTAMP), * FROM tbl_dbsync_meta

但现在它以 INTEGER 形式返回,返回的只是年份(2012 年)。

解决这个问题的一个简单方法是直接SELECT sqlite 本身的时间差异,而不是将它们检索到 python 中然后到处玩。另一个选择是我使用CURRENT_TIMESTAMP 返回的字符串,在 Python 中将其转换为“日期时间”并使用它。

但是我需要了解CURRENT_TIMESTAMP(演员或其他)和其他TIMESTAMP 字段之间的区别是什么。这不起作用似乎是错误的。

感谢您的帮助。

P.S:请注意,我从不将 Python 日期时间对象直接存储到 SQLite 中。每当我需要更新此表时,我只需 SET global_scores_last_checked = CURRENT_TIMESTAMP。我只是出于必要才将 SQLite 中的日期检索到 Python 中。

【问题讨论】:

  • 我有 detect_types=sqlite3.PARSE_DECLTYPES 设置 btw
  • 这似乎是一般的“功能”问题。我试过这个 - 从 tbl_dbsync_meta 中选择(CURRENT_TIMESTAMP - maindb_last_checked)。这也给我返回了一个 unicode 字符串,而不是一个 DATETIME 对象。而如果我只选择一个现有的 TIMESTAMP 字段 - 例如“maindb_last_checked” - 它会返回一个日期时间对象.......这是问题吗?
  • 您是如何将 Python datetime 对象存储到时间戳列中的?他们是如何转变的?请也发布一些 Python 代码。
  • @Tichodroma,这是一个很好的问题。我实际上并没有将 Python 日期时间对象直接存储到 sqlite 中。我所做的只是用“UPDATE tbl_dbsync_meta SET global_scores_last_checked = CURRENT_TIMESTAMP”来更新这些时间戳。所以日期时间值都是 SQLite 内部的。

标签: python datetime sqlite timestamp


【解决方案1】:

连接时需要设置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 不起作用(很可能是错误)并且 CURRENT_TIMESTAMP 确实没有返回日期时间类型,这可能是错误或功能(请记住,Sqlite 没有日期/时间类型的概念,它将它们存储为 TEXT /REAL/整数)。

【讨论】:

  • 这是(字面意思)多年后,很抱歉我不记得为什么我当时没有回应这个答案 - 有几个疑问。首先,“SET column_name = CURRENT_TIMESTAMP”然后读取该列与“SELECT CURRENT_TIMESTAMP”有什么区别?因为我在第一种情况下得到了一个日期时间对象。这可能只是你提到的一个错误吗?第二个问题 - 我的 SQL 语法知识生疏 - 在“ts [timestamp]”中,“timestamp”应该表示查询中返回的“虚拟”“ts”列的数据类型?
猜你喜欢
  • 1970-01-01
  • 2017-01-14
  • 2022-01-13
  • 1970-01-01
  • 1970-01-01
  • 2016-06-24
  • 2020-05-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多