MySQL TIMESTAMP для QDateTime с миллисекундами

Если я использую QSqlTableModel для доступа к базе данных MySQL, я могу преобразовать поле TIMESTAMP, используя следующее:

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

Итак, str показывает, т.е. 2014-06-22 22:11:44.221. Но я хочу получить доступ к базе данных с помощью QSqlQuerry, поэтому я:

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

Но теперь мне не хватает миллисекунд, str показывает 2014-06-22 22:11:44.000. Каков правильный способ увидеть миллисекунды?

Если я делаю str = query.value(column).toString();, тогда я получаю 2014-06-22T22:11:44.

Ответ 1

С этой страницы:

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

Значение DATETIME или TIMESTAMP может включать трейлинг-дробное секунд в минуту до точностью до микросекунд (6 цифр). В в частности, с MySQL 5.6.4, любая дробная часть в вставленном значении в столбце DATETIME или TIMESTAMP сохраняется, а не отбрасывается.

Итак, миллисекунда существует в MySQL! Но query.value() не получает этого - на данный момент в истории Qt, как указано @peppe здесь.

Относится к исходному вопросу: нет правильного способа увидеть миллисекунду, так как запрос ее не имеет. Одним из вариантов может быть изменение запроса:

SELECT timestamp FROM table;

to

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

И затем закончить работу с помощью:

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

Я получил информацию от здесь.

Ответ 2

С этой страницы:

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

"Значение DATETIME или TIMESTAMP может включать в себя конечную часть дробных секунд с точностью до микросекунд (6 цифр). Хотя эта дробная часть распознана, она отбрасывается из значений, хранящихся в столбцах DATETIME или TIMESTAMP."

Кажется, что секунды - это лучшее, что вы можете сделать с меткой времени.