2015-07-23 13 views
13

Se uso un QSqlTableModel per accedere a un database MySQL posso convertire un campo timestamp usando il seguente:MySQL TIMESTAMP per QDateTime con millisecondi

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

Così str spettacoli, vale a dire 2014-06-22 22:11:44.221. ma voglio accedere al database utilizzando QSqlQuerry, così faccio:

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

Ma ora mi manca i millisecondi, str mostra 2014-06-22 22:11:44.000. Qual è il modo corretto di vedere i millisecondi?

Se faccio str = query.value(column).toString(); poi ottengo 2014-06-22T22:11:44.

+0

Sei sicuro che TIMESTAMP abbia nanosecondi? – Miki

+0

Sicuro. Oltre a vedere i milisecondi durante l'accesso con QTableModel, posso confermarlo accedendo al database con HeidiSQL (www.heidisql.com). – KcFnMi

+0

HeidiSQL effettivamente dice che il campo è un TIMESTAMP (3). – KcFnMi

risposta

7

Da questa pagina:

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

Un valore DATETIME o TIMESTAMP può includere un frazionaria secondi parte finale fino a microsecondi (6 cifre) precisione. Nello specifico , a partire da MySQL 5.6.4, qualsiasi parte frazionaria in un valore inserito in una colonna DATETIME o TIMESTAMP viene memorizzata anziché scartata.

Quindi, il millisecondo è lì in MySQL! Ma lo query.value() non lo ottiene - a questo punto nella cronologia di Qt come indicato da @peppehere.

Rispetto alla domanda originale: non esiste un modo corretto di vedere il millisecondo poiché la query non ce l'ha. Un'alternativa potrebbe essere quella di modificare la query, da:

SELECT timestamp FROM table; 

a

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

E poi terminare il lavoro con:

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

ho avuto l'intuizione da here.

3

Da questa pagina:

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

"Un valore DATETIME o TIMESTAMP può includere un secondo frazionaria parte finale fino a microsecondi (6 cifre) precisione Sebbene questa parte frazionaria viene riconosciuto, viene scartato. dai valori memorizzati nelle colonne DATETIME o TIMESTAMP. "

Sembra che il secondo sia il meglio che si possa fare con il timestamp.

+0

Ho controllato lo script che crea il database, il campo è un TIMESTAMP (3) - MySQL 5.6.17. Sicuramente ha dei millisecondi. Sei d'accordo? Inoltre, ho controllato come è fatto l'INSERT, è un QDateTime :: toString con lo stesso formato di quello indicato nella domanda. A questo punto sono in dubbio se questo approccio è corretto (il migliore), voglio dire: TIMESTAMP (3) è il miglior tipo per memorizzare un QDateTime :: toString ("aaaa-MM-gg hh: mm: ss.zzz ")? Comunque ora penso di aver posto la domanda a molto sul lato MySQL, il mio intento è di lavorare sul lato Qt (come far apparire i millisecondi in quella query sopra?). – KcFnMi

Problemi correlati