2010-12-13 33 views
7

Tôi đang sử dụng Python để tạo cơ sở dữ liệu trong bộ nhớ sqlite3 với cột dấu thời gian. Khi tôi sử dụng min() hoặc max() trên cột này trong truy vấn của mình, cột được trả về dưới dạng chuỗi thay vì đối tượng datetime của Python. Tôi đọc một số previous question on Stackoverflow cung cấp giải pháp cho các câu lệnh SELECT bình thường, nhưng nó không hoạt động nếu sử dụng max() hoặc min(). Dưới đây là một ví dụ:Đọc lại ngày giờ trong sqlite3

>>> db = sqlite3.connect(':memory:', detect_types=sqlite3.PARSE_DECLTYPES) 
>>> c = db.cursor() 
>>> c.execute('create table foo (bar integer, baz timestamp)') 
<sqlite3.Cursor object at 0x7eff420e0be0> 
>>> c.execute('insert into foo values(?, ?)', (23, datetime.datetime.now())) 
<sqlite3.Cursor object at 0x7eff420e0be0> 
>>> c.execute('select * from foo') 
<sqlite3.Cursor object at 0x7eff420e0be0> 
>>> c.fetchall() 
[(23, datetime.datetime(2010, 12, 14, 1, 15, 54, 685575))] 
>>> c.execute('select max(baz) from foo') 
<sqlite3.Cursor object at 0x7eff420e0be0> 
>>> c.fetchall() 
[(u'2010-12-14 01:15:54.685575',)] 

Tôi cố gắng để đúc kết quả vào một dấu thời gian nhưng nó chỉ trả về năm:

>>> c.execute('select cast(max(baz) as timestamp) from foo') 
<sqlite3.Cursor object at 0x7eff420e0be0> 
>>> c.fetchall() 
[(2010,)] 

Có cách nào để lấy một đối tượng datetime thích hợp, mà không tự chuyển đổi chuỗi sử dụng datetime.strptime() sau khi tìm nạp nó?

Trả lời

13

Bạn phải thiết lập detect_types để sqlite.PARSE_COLNAMES và sử dụng as "foo [timestamp]" như thế này:

import sqlite3 
import datetime 

db = sqlite3.connect(':memory:', detect_types = sqlite3.PARSE_COLNAMES) 
c = db.cursor() 
c.execute('create table foo (bar integer, baz timestamp)') 
c.execute('insert into foo values(?, ?)', (23, datetime.datetime.now())) 
c.execute('insert into foo values(?, ?)', (42, datetime.datetime.now() + datetime.timedelta(-1))) 
c.execute('select bar, baz as "ts [timestamp]" from foo') 
print c.fetchall() 
c.execute('select max(baz) as "ts [timestamp]" from foo') 
print c.fetchall() 

Đã làm một chút tìm kiếm Google tốt đẹp và tìm thấy this message.

+0

Làm việc cho tôi, cảm ơn! – del

Các vấn đề liên quan