Postgres конвертирует разницу времени и даты в ЧЧ: ММ: СС - PullRequest
0 голосов
/ 29 декабря 2018

Пример:

startTime-EndTime 

Разница составляет 0 лет 0 месяцев 5 дней 20 часов 6 минут 30 секунд.Я хочу преобразовать это в формат ЧЧ: ММ: СС: 120: 06: 30.

Ответы [ 2 ]

0 голосов
/ 29 декабря 2018

Этого можно добиться с помощью postgresql.

Чтобы вычислить разницу между двумя временными метками в виде количества секунд, используйте:

EXTRACT(EPOCH FROM (startTime - endTime))

Затем настройте это значение обратно на временную метку с помощьюфункцию TO_TIMESTAMP и отформатируйте ее как время, используя функцию TO_CHAR.

Часовая часть сложна, так как вы хотите отобразить значения больше 24 (что, как и следовало ожидать, является максимальным допустимым значением в postgres): вам нужно использовать небольшую арифметику для ее вычисления.

SELECT CONCAT(
    EXTRACT(EPOCH FROM (startTime - endTime))/60/60,
    ':',
    TO_CHAR(TO_TIMESTAMP(
         EXTRACT(EPOCH FROM (startTime - endTime))
      ), 'MI:SS')
 )
FROM my_table
0 голосов
/ 29 декабря 2018

tl; dr

Duration                                                 // Represent a span-of-time in terms of total number of whole seconds plus a fractional second in nanos.
.between(                                                // Calculate elapsed time.
    myResultSet.getObject( … , OffsetDateTime.class ) ,  // Start
    myResultSet.getObject( … , OffsetDateTime.class ) ,  // Stop
)                                                        // Returns a `Duration` object.
.toString()                                              // Generate text in standard ISO 8601 format of `PnYnMnDTnHnMnS`. 

java.time

Выполнить это на стороне Java просто со столбцом типа данных, похожим на стандарт SQL TIMESTAMP WITH TIME ZONE и драйверомсоответствует JDBC 4.2 или более поздней версии (для поддержки современных java.time классов).

OffsetDateTime

Получите ваши моменты как OffsetDateTime объектов, в соответствии с JDBC 4.2 spec .

OffsetDateTime start = myResultSet.getObject( … , OffsetDateTime.class ) ;
OffsetDateTime stop = myResultSet.getObject( … , OffsetDateTime.class ) ;

Duration

Рассчитать прошедшее время как Duration объект.

Duration d = Duration.between( start , stop ) ;

ISO 8601

Создать стандарт ISO 8601 строка в формате PnYnMnDTnHnMnS, где P обозначает начало (вероятно, означает «период» - к сожалению, нет стандартизированных терминов в обработке даты и времени), а T отделяет годы-месяцы-дни от часов-минут-секунд.Таким образом, полтора часа будет PT1H30M.Ваш пример 5 days 20hours 6minutes 30 seconds будет P5DT20H6M30S.

Классы java.time по умолчанию используют формат ISO 8601.Таким образом, вы генерируете текст, просто вызывая toString.Не нужно указывать шаблон форматирования.

String output = d.toString() ;

P5DT20H6M30S

Для разбора наберите parse.

Duration d = Duration.parse( "P5DT20H6M30S" ) ;

Обратите внимание, что Duration считает дни как 24-часовой период времени без учета календаря.Если вам нужны календарные даты, используйте класс Period.Если вы хотите объединить оба понятия, используйте класс PeriodDuration из ThreeTen-Extra , но подумайте дважды, поскольку смешивание двух понятий обычно неразумно и нецелесообразно.

Я настоятельно советую вам не представлять промежуток времени, используя обозначение часов, как показано в вашем Вопросе.Это неоднозначно, чревато ошибками, когда люди неправильно интерпретируют текст, как я лично видел в бизнес-сценариях.Стандартный формат намного мудрее.

Duration::to…Part

Но если вы настаиваете на форматировании часов, создайте строку, вызвав методы to…Part для Duration.

String output = d.toDaysPart() + ":" + d.toHoursPart() + ":" + d.toMinutesPart() + ":" + d.toSecondsPart() + "." + d.toNanosPart() ; 

toHours против toHoursPart

Если вы хотите, чтобы все дни указывались как часы, получите общее количество часов за весь промежуток времени, позвонив по номеру toHours вместо toHoursPart.Затем получите доли минут и секунд.

Duration d = Duration.between( start , stop ) ;
String output = d.toHours() + ":" + d.toMinutesPart() + ":" + d.toSecondsPart() ;

120: 06: 30


О java.time

Платформа java.time встроена в Java 8 и более поздние версии.Эти классы вытесняют проблемные старые устаревшие классы даты и времени, такие как java.util.Date, Calendar, & SimpleDateFormat.

Проект Joda-Time , теперь в режиме обслуживания , рекомендует перейти на классы java.time .

Чтобы узнать больше, см. Oracle Tutorial .И поиск переполнения стека для многих примеров и объяснений.Спецификация: JSR 310 .

Вы можете обмениваться java.time объектами напрямую с вашей базой данных.Используйте драйвер JDBC , совместимый с JDBC 4.2 или более поздней версии.Нет необходимости в строках, нет необходимости в java.sql.* классах.

Где получить классы java.time?

  • Java SE 8 , Java SE 9 , Java SE 10, Java SE 11 и более поздние версии - часть стандартного Java API с связанной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и JavaSE 7
    • Большинство функций java.time перенесено в Java 6 & 7 в ThreeTen-Backport .
  • Android
    • Более поздние версии комплектов Android для реализации java.time классы.
    • Для более ранних версий Android (<26) проект <a href="https://github.com/JakeWharton/ThreeTenABP" rel="nofollow noreferrer"> ThreeTenABP адаптируется ThreeTen-Backport (упомянутое выше).См. Как использовать ThreeTenABP… .

ThreeTen-Extra Проект расширяет java.time дополнительными классами.Этот проект является полигоном для возможных будущих дополнений к java.time.Здесь вы можете найти несколько полезных классов, таких как Interval, YearWeek, YearQuarter и more .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...