Форум программистов, компьютерный форум, киберфорум
PostgreSQL
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
2 / 2 / 1
Регистрация: 09.06.2012
Сообщений: 29

Формат вывода типа INTERVAL

25.10.2022, 20:36. Показов 950. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, подскажите, пожалуйста, есть ли более простой (может быть стандартный способ) вывести поле типа INTERVAL в формате (...ЧЧЧ.ММ.СС) 9547.59.59 вместо формата (Годы Месяцы Дни ЧЧ.ММ.СС) 2 years 3 months 8 days 19:57:00 (Т.Е. чтобы вместо показа дней, месяцев и годов, показывалось только количество часов, включающее в себя и годы и месяцы и дни.),
не считая способа перевода INTERVALа в секунды EXTRACT(epoch FROM имя_столбца)::INTERVAL), с последующим делением и взятием остатков на 60 и 3600, и затем составлением из этих чисел конечной строки нужного формата?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
25.10.2022, 20:36
Ответы с готовыми решениями:

формат поля типа Yes/No в форме
Привет, ALL Есть таблица, содержащая текстовое поле типа Yes/No. Формат этого поля задан как Yes/No. Теперь делаем на основе этой...

формат вывода поля типа date в dbgrid
Помогите пожалуйста с проблемой: не могу отобразить в dbgrid поле типа date в формате dd.mm.yyyy. БД MsSQL. По умолчанию выводит дату в...

Формат вывода
Здравствуйте, уважаемые форумчане! Помогите, пожалуйста, исправить вывод, чтобы табличка ровненькой была. int main() { ...

4
1265 / 979 / 384
Регистрация: 02.09.2012
Сообщений: 3,026
25.10.2022, 23:42
Лучший ответ Сообщение было отмечено numberone как решение

Решение

Вот такой грязный хак работает
SQL
1
SELECT INTERVAL '1 seconds' * date_part('epoch', INTERVAL '2 years 3 months 8 days 19:57:00');
1
2 / 2 / 1
Регистрация: 09.06.2012
Сообщений: 29
26.10.2022, 00:14  [ТС]
grgdvo, спасибо, не понимаю, как это работает, но работает
0
1265 / 979 / 384
Регистрация: 02.09.2012
Сообщений: 3,026
27.10.2022, 00:15
Цитата Сообщение от numberone Посмотреть сообщение
не понимаю, как это работает, но работает
итервал хранится внутри как 128 битное число. первые 64 бита это время с точностью до микросекунд, еще 32бита это количество дней, еще 32 бита - это количество месяцев. Когда начинаем делать из этого что-то похожее на строку, то поле время преобразуется в часы:минуты:секунды... поэтому и получаем нужный результат.

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

Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
/* interval2itm()
 * Convert an Interval to a pg_itm structure.
 * Note: overflow is not possible, because the pg_itm fields are
 * wide enough for all possible conversion results.
 */
void
interval2itm(Interval span, struct pg_itm *itm)
{
    TimeOffset  time;
    TimeOffset  tfrac;
 
    itm->tm_year = span.month / MONTHS_PER_YEAR;
    itm->tm_mon = span.month % MONTHS_PER_YEAR;
    itm->tm_mday = span.day;
    time = span.time;
 
    tfrac = time / USECS_PER_HOUR;
    time -= tfrac * USECS_PER_HOUR;
    itm->tm_hour = tfrac;
    tfrac = time / USECS_PER_MINUTE;
    time -= tfrac * USECS_PER_MINUTE;
    itm->tm_min = (int) tfrac;
    tfrac = time / USECS_PER_SEC;
    time -= tfrac * USECS_PER_SEC;
    itm->tm_sec = (int) tfrac;
    itm->tm_usec = (int) time;
}


Если интервал брать в пределах поля времени (задавать часы, минуты и секунды), то будет преобразовываться к строке в виде часов, минут и секунд.

Например

SQL
1
2
3
SELECT INTERVAL '1 seconds' * 1000; -- >>>>> 00:16:40
SELECT INTERVAL '2 seconds' * 1000; -- >>>>> 00:33:20
SELECT INTERVAL '1000 hours' * 1000; -- >>>>>> 1000000:00:00
как только начинаете затрагивать другие поля структуры интервала (дни и месяцы), получите уже приведение в виде лет, месяцев и дней. при этом подсчеты по полям будут независимыми

Например

SQL
1
2
3
SELECT INTERVAL '1 day 1 hour' * 1000; -- >>>>>> 1000 days 1000:00:00
SELECT INTERVAL '2 days' * 1000; -- >>>>>>> 2000 days
SELECT INTERVAL '1 month 1 day' * 1000; -- >>>>>> 83 years 4 mons 1000 days
Поэтому, что мы сделали фактически, запустив это
SQL
1
SELECT INTERVAL '1 seconds' * date_part('epoch', INTERVAL '2 years 3 months 8 days 19:57:00');
Мы интервал '1 секунда' умножили на количество секунд в заданном входном интервале. В результате получили заданный интервал в секундах, который хранится только в поле времени, которое и преобразуется в часы:минуты:секунды.

Честно говоря, не помню, где эта часть про интервалы описана в документации PG. Не уверен, что это соответствует какой-либо версии SQL-стандарта. Поэтому и назвал грязным хаком, потому что код скорее не переносим на другие СУБД (не знаю).
1
2 / 2 / 1
Регистрация: 09.06.2012
Сообщений: 29
27.10.2022, 02:50  [ТС]
grgdvo, спасибо, понятно
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
27.10.2022, 02:50
Помогаю со студенческими работами здесь

Формат вывода
Ребятки всем привет... Подскажите пожалуйста, кто может.... Такая проблема у меня, мне нужно сделать формат вывода для вот такой...

Формат вывода
здравствуйте. вот задача "Напишите программу, увеличивающую каждый элемент матрицы (n,m) в 3 раза и сохраняющую результат в виде второй...

Формат вывода
Доброго времени, необходимо вывести "красиво" результаты 1200 624.2857 1939,428 Я так понимаю нужно что-то добавить в данную...

Неправильный формат вывода
Добрый день! Задание: Напишите программу, которая заполняет массив из N элементов случайными целыми числами в диапазоне и определяет...

Не правильный формат вывода =(
Не одно, так другое.....в общем, у меня раньше был не Set *set. А vector<SetElement> и когда я писал строки типа Set set1,set2;...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
Контроль уникальности заводского номера - вариант №2
Maks 24.03.2026
В отличие от предыдущего варианта добавлено прерывание циклов, также добавлены новые переменные для сохранения контекста ошибки перед прерыванием цикла: Процедура ПередЗаписью(Отказ, РежимЗаписи,. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера - вариант №1
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью в КА2. Данные берутся из регистра сведений, по которому настроено. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа в КА2. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru