как убедиться, что миллисекунды даты хранятся в базе данных?

Я использую Grails 2.2 с MySQL.

Я получаю время как временную метку unix.

def raceStartTime = params.raceStart //milliseconds epoch time

Затем я конвертирую время в дату, как показано ниже.

Date startDateTime = new Date(raceStartTime.toLong())

и сохранить его в базе данных

Race r = new Race()
r.start = startDateTime 
r.save()

Получается, что при сохранении даты в БД mysql теряется точность, т.е. не записывается точное значение миллисекунд. Кажется, время записывается как чч мм сс. Мне нужно сохранить дробную часть секунды. Есть ли способ сделать так, чтобы при сохранении даты преобразования метки времени дробная часть секунды не терялась? Спасибо за помощь!

ОБНОВИТЬ:

Я использовал следующий блок отображения, чтобы изменить тип данных.

static mapping = {
    debug type: 'text'
    raceStart sqlType:  'DATETIME(6)'
    raceEnd sqlType:  'DATETIME(6)'
}

После этого я запускаю dbm-gorm-diff, но он не создает журнал изменений. Я ценю любое руководство. Спасибо!


person kofhearts    schedule 23.08.2020    source источник


Ответы (1)


Это связано с тем, как вы определили столбец start в MySQL. Из документации:

MySQL поддерживает доли секунды для значений TIME, DATETIME и TIMESTAMP с точностью до микросекунд (6 цифр).

Чтобы определить столбец, содержащий доли секунды, используйте синтаксис type_name(fsp), где type_name – это TIME, DATETIME или TIMESTAMP, а fsp – точность долей секунды. Например:

CREATE TABLE t1 (t TIME(3), dt DATETIME(6));

Значение fsp, если оно задано, должно находиться в диапазоне от 0 до 6. Значение 0 означает, что дробная часть отсутствует. Если этот параметр опущен, точность по умолчанию равна 0. (Это отличается от стандартного значения SQL по умолчанию, равного 6, для совместимости с предыдущими версиями MySQL.)

Следовательно, убедитесь, что вы создаете свою таблицу с помощью:

 CREATE TABLE race (... start DATETIME(6) ...)

изменить: я не эксперт по Grails, но я думаю, что вы можете настроить это сопоставление, определив следующее в своем классе Race:

static mapping = {
   start sqlType: "DATETIME", precision: 6
}
person Derlin    schedule 23.08.2020
comment
благодарю вас. Можете ли вы дать решение Grails для этого? я думаю, что это можно сделать с помощью блока сопоставления, но я не знаю, какое значение поставить, чтобы изменить точность. Спасибо! - person kofhearts; 24.08.2020