4

アプリケーションでメタデータのオフライン処理を行うためにローカルの sqlite データベースを使用していますが、メタデータにはタイムスタンプが含まれています。

次のように宣言されたテーブルがあります。

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

さて、ある時点で、CURRENT_TIMESTAMP上記の他のすべてのタイムスタンプとともに sqlite から を取得して、当然のことながら、現在とこれらすべての他のタイムスタンプとの時間差を把握します。

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

しかし、現在は INTEGER として返されており、返されるのは年 (2012) だけです。

これを回避する簡単な方法はSELECT、時間差を python に取得してからいじる代わりに、sqlite 自体から直接時間差を取得することです。別のオプションは、によって返された文字列を使用しCURRENT_TIMESTAMP、Python でそれを「datetime」に変換して使用することです。

CURRENT_TIMESTAMPただし、 (キャストまたはその他の)フィールドと他のフィールドの違いを理解する必要がありTIMESTAMPます。これが機能しないのは間違っているようです。

ご協力いただきありがとうございます。

PS: Python の datettime オブジェクトを SQLite に直接格納することはありません。このテーブルを更新する必要があるときはいつでも、SET global_scores_last_checked = CURRENT_TIMESTAMP. 必要に応じて、SQLite から Python に日付を取得するだけです。

4

1 に答える 1

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 は機能せず (ほとんどの場合バグ)、CURRENT_TIMESTAMP は実際には日時型を返しません。これはバグまたは機能である可能性があります (Sqlite には日付/時刻型の概念がなく、TEXT/REAL/ として保存されることを思い出してください)整数)。

于 2012-08-07T13:26:53.807 に答える