2009-04-18 5 views
19

Một bảng cơ sở dữ liệu mysql có một cột có kiểu dữ liệu là thời gian (http://dev.mysql.com/doc/refman/5.0/en/time.html). Khi dữ liệu bảng được truy cập, Python trả về giá trị của cột này như là một đối tượng datetime.timedelta. Làm cách nào để trích xuất thời gian này? (Tôi đã không thực sự hiểu những gì timedelta là từ hướng dẫn sử dụng python).Python: Làm thế nào để có được thời gian từ một đối tượng datetime.timedelta?

Ví dụ: Các cột trong bảng chứa giá trị "18:00:00" Python-MySQLdb trả này như datetime.timedelta (0, 64800)


Hãy bỏ qua những gì là bên dưới (nó trở lại giá trị khác nhau) -

Đã thêm: Không phân biệt giá trị thời gian trong bảng, python-MySQLdb dường như chỉ trả về datetime.timedelta (0, 64800).

Lưu ý: Tôi sử dụng Python 2.4

Trả lời

28

Đó là lạ mà Python trả về giá trị như một datetime.timedelta. Có lẽ nó phải trả lại một số datetime.time. Dù sao, có vẻ như nó trả về thời gian trôi qua kể từ nửa đêm (giả sử cột trong bảng là 6:00 chiều). Để chuyển đổi sang một datetime.time, bạn có thể làm như sau ::

value = datetime.timedelta(0, 64800) 
(datetime.datetime.min + value).time() 

datetime.datetime.mindatetime.time() là, tất nhiên, ghi nhận như một phần của các mô-đun datetime nếu bạn muốn biết thêm thông tin.

A datetime.timedelta, bằng cách này, thể hiện sự khác biệt giữa hai giá trị datetime.datetime. Vì vậy, nếu bạn trừ một số datetime.datetime từ một số khác, bạn sẽ nhận được datetime.timedelta. Và nếu bạn thêm một số datetime.datetime với số datetime.timedelta, bạn sẽ nhận được datetime.datetime. Đó là cách mã hoạt động.

+3

Tôi nên đề cập rằng nỗ lực đầu tiên của tôi là sử dụng 'datetime.time.min + value', nhưng điều này không có tác dụng, vì các đối tượng' datetime.time' không thể được thêm vào 'datetime.timedelta' objects. –

+0

Python chỉ trả về datetime.timedelta (0, 64800), không phụ thuộc vào giá trị thời gian thực tế. – Sam

+1

Vâng, tôi đã chán ngấy những cách khác nhau ngày tháng và thời gian được báo hiệu qua các lớp DB-API khác nhau, các phiên bản khác nhau của MySQLdb và Python, và thậm chí các thư viện có sẵn khác nhau (ví dụ: mxDateTime). Bây giờ tôi chỉ sử dụng số nguyên và thời gian Unix. Trừ khi bạn cần phải làm các truy vấn dựa trên ngày trong tuần hoặc một cái gì đó, điều này nói chung là dễ dàng hơn nhiều. – bobince

2

Dường như với tôi rằng loại thời gian trong MySQL được dùng để biểu diễn các khoảng thời gian như datetime.timedelta thực hiện trong Python. Từ tài liệu bạn đã tham chiếu:

Giá trị thời gian có thể dao động từ '-838: 59: 59' đến '838: 59: 59'. Phần giờ có thể quá lớn vì loại TIME có thể được sử dụng không chỉ để biểu thị thời gian trong ngày (phải ít hơn 24 giờ), mà còn thời gian trôi qua hoặc khoảng thời gian giữa hai sự kiện (có thể lớn hơn nhiều 24 giờ, hoặc thậm chí tiêu cực).

Cách thay thế để chuyển đổi từ datetime.timedelta thành datetime.time sẽ thay đổi loại cột thành DATETIME và không sử dụng các trường ngày tháng.

-Insert:

tIn = datetime.datetime(
    year=datetime.MINYEAR, 
    month=1, 
    day=1, 
    hour=10, 
    minute=52, 
    second=10 
    ) 
cursor.execute('INSERT INTO TableName (TimeColumn) VALUES (%s)', [tIn]) 

-Chọn:

cursor.execute('SELECT TimeColumn FROM TableName') 
result = cursor.fetchone() 
if result is not None: 
    tOut = result[0].time() 
    print 'Selected time: {0}:{1}:{2}'.format(tOut.hour, tOut.minute, tOut.second) 

datetime.time() được gọi trên đối tượng datetime để có được một đối tượng thời gian.