2015-07-23 26 views
13

Nếu tôi sử dụng một QSqlTableModel để truy cập cơ sở dữ liệu MySQL tôi có thể chuyển đổi một lĩnh vực dấu thời gian bằng cách sử dụng sau đây:MySQL dấu thời gian để QDateTime với mili giây

QDateTime dateTime = index(section, column).data().toDateTime(); 
QString str = dateTime.toString("yyyy-MM-dd hh:mm:ss.zzz"); 

Vì vậy str chương trình, ví dụ: 2014-06-22 22:11:44.221. Nhưng tôi muốn truy cập vào cơ sở dữ liệu sử dụng QSqlQuerry, vì vậy tôi làm:

QDateTime dateTime = query.value(column).toDateTime(); 
str = dateTime.toString("yyyy-MM-dd hh:mm:ss.zzz"); 

Nhưng bây giờ tôi đang thiếu mili giây, str lãm 2014-06-22 22:11:44.000. Cách thích hợp để xem mili giây là gì?

Nếu tôi làm str = query.value(column).toString(); thì tôi nhận được 2014-06-22T22:11:44.

+0

Bạn có chắc chắn rằng TIMESTAMP có nano giây không? – Miki

+0

Chắc chắn. Bên cạnh việc nhìn thấy mili giây trong khi truy cập với QTableModel, tôi có thể xác nhận nó truy cập vào cơ sở dữ liệu với HeidiSQL (www.heidisql.com). – KcFnMi

+0

HeidiSQL thực sự nói rằng trường là dấu thời gian (3). – KcFnMi

Trả lời

7

Từ trang này:

https://dev.mysql.com/doc/refman/5.6/en/datetime.html

Một DATETIME hoặc dấu thời gian giá trị có thể bao gồm một trailing phân đoạn giây tham gia lên đến micro (6 chữ số) chính xác. Trong cụ thể, như của MySQL 5.6.4, bất kỳ phần phân đoạn nào trong một giá trị được chèn vào cột DATETIME hoặc TIMESTAMP được lưu trữ thay vì bị loại bỏ.

Vì vậy, mili giây có trong MySQL! Nhưng các query.value() không nhận được nó - tại thời điểm này trong lịch sử Qt như chỉ bằng @peppehere.

Liên quan đến câu hỏi gốc: Không có cách nào thích hợp để xem mili giây kể từ khi truy vấn không có nó. Một thay thế có thể thay đổi các truy vấn, từ:

SELECT timestamp FROM table; 

để

SELECT DATE_FORMAT(timestamp, '%Y-%c-%e %H:%i:%s.%f') as timestamp FROM table; 

Và sau đó hoàn thành công việc với:

QString str = query.value(column).toString(); 
QDateTime dateTime = QDateTime::fromString(str, "yyyy-MM-dd hh:mm:ss.zzz000"); 

tôi có cái nhìn sâu sắc từ here.

3

Từ trang này:

https://dev.mysql.com/doc/refman/5.1/en/datetime.html

"Một DATETIME hoặc dấu thời gian giá trị có thể bao gồm một trailing phân đoạn giây tham gia lên đến micro (6 chữ số) chính xác Mặc dù phần phân đoạn này được công nhận, nó được loại bỏ. từ các giá trị được lưu trữ trong các cột DATETIME hoặc TIMESTAMP. "

Có vẻ như giây là cách tốt nhất bạn có thể thực hiện với dấu thời gian.

+0

Tôi đã kiểm tra tập lệnh tạo cơ sở dữ liệu, trường là dấu thời gian (3) - MySQL 5.6.17. Chắc chắn nó có mili giây. Bạn có đồng ý không? Ngoài ra, tôi đã kiểm tra làm thế nào INSERT được thực hiện, đó là một QDateTime :: toString với cùng một định dạng như đã nói trong câu hỏi. Tại thời điểm này tôi đang nghi ngờ nếu phương pháp này là chính xác (tốt nhất), tôi có nghĩa là: là TIMESTAMP (3) loại tốt nhất để lưu trữ một QDateTime :: toString ("yyyy-MM-dd hh: mm: ss.zzz ")? Dù sao bây giờ tôi nghĩ rằng tôi đặt câu hỏi để nhiều ở phía MySQL, ý định của tôi là làm việc ở phía Qt (làm thế nào để làm cho mili giây xuất hiện trong truy vấn đó ở trên?). – KcFnMi

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