Является ли структура базы данных фиксированной? Я думаю, TIME
или TIMESTAMP
, вероятно, не лучший тип данных для продолжительности. Я бы изменил тип столбца на BIGINT
(aka Long
) и конвертировал продолжительность в миллисекунды (или наносекунды в зависимости от ваших потребностей) с Duration.toMillis()
.
Если это не вариант, вы можете использовать аналогичную логику и представлять продолжительность как смещение от определенной отметки времени, например 1970-01-01T00:00:00.000Z
с Duration.addTo(referenceDate)
или java.sql.Time(durationInMillis)
. Чтобы снова получить экземпляр Duration
, вам нужно будет использовать Duration.ofMillis(sqlTime.getTime())
.
Это в основном варианты у вас есть:
Использование BIGINT
в качестве колонного типа (предпочтительное решение):
// from java.time.Duration to java.lang.Long
{
final Duration duration = ...
final PreparedStatement pStmnt = con.prepareStatement("...");
pStmnt.setLong(n, duration.toMillis());
}
// from java.lang.Long to java.time.Duration
{
final PreparedStatement pStmnt = con.prepareStatement("...");
final ResultSet resultSet = pStmnt.getResultSet();
while (resultSet.next()) {
final Long durationInMillis = resultSet.getLong(n);
final Duration duration = Duration.ofMillis(durationInMillis);
...
}
}
Использование TIME
или TIMESTAMP
как тип столбца. Вы можете заменить java.sql.Time
с java.sql.Timestamp
в коде ниже в зависимости от фактического типа столбца:
// from java.time.Duration to java.sql.Time(stamp)
{
final Duration duration = ...
final Time time = new Time(duration.toMillis());
final PreparedStatement pStmnt = con.prepareStatement("...");
pStmnt.setTime(n, time);
}
// from java.sql.Time(stamp) to java.time.Duration
{
final PreparedStatement pStmnt = con.prepareStatement("...");
final ResultSet resultSet = pStmnt.getResultSet();
while (resultSet.next()) {
final Time time = resultSet.getTime(n);
final Duration duration = Duration.ofMillis(time.getTime());
...
}
}
Согласно документации в MySQL TIME
типа поддерживает диапазоны от -838:59:59
до 838:59:59
(см here). Но по умолчанию ни один из типов TIME
, DATE
или TIMESTAMP
не поддерживает дробные секунды, если только заданная точность не указана во время создания столбцов базы данных (см. here). То есть для хранения миллисекунды в TIME
столбце таблицы должен быть создан так:
CREATE TABLE t1 (t TIME(3));
Обновление:
- Добавлено более подробные примеры кода
- Добавлена ссылка Документация MySQL относительно поддерживаемых минимальных значений для
TIME
Хотя я согласен с тем, что хранить длительность в столбце 'TIME' не рекомендуется, это не будет длиться дольше 24 часов. Я обновил свой ответ ссылкой на соответствующий раздел документации по MySQL ... – dpr
@dp Интересно, я не знал этого о 'TIME' в MySQL. Однако я не думаю, что это было бы полностью поддержано через 'java.sql.Time'. –
похоже - не знаю, официально ли это поддерживается. Можно создать произвольные длинные экземпляры 'java.sql.Time', используя конструктор' Time (long) '. Однако я не уверен, как это выглядит, когда речь заходит о поддержке других СУБД ... – dpr