powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Сортировка типа interval
7 сообщений из 7, страница 1 из 1
Сортировка типа interval
    #39794969
_stas_k_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Коллеги, кто-нибудь может объяснить логику сортировки типа interval?
Гугл не помог...

WITH data as (
SELECT '2019-03-31 22:00'::timestamp as dt
UNION ALL SELECT '2019-03-31 18:30'
UNION ALL SELECT '2019-04-01 21:00'
)
SELECT dt, age(dt,'2019-01-01') as a
FROM data
ORDER BY a;
...
Рейтинг: 0 / 0
Сортировка типа interval
    #39794986
Павел Лузанов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_stas_k_,

Документация :
Вычитание дат и дат со временем также может быть нетривиальной операцией. Один принципиально простой способ выполнить такое вычисление — преобразовать каждое значение в количество секунд, используя EXTRACT(EPOCH FROM ...), а затем найти разницу результатов; при этом будет получено число секунд между двумя датами.
...
Рейтинг: 0 / 0
Сортировка типа interval
    #39794994
_stas_k_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Павел Лузанов, я знаю, как это обойти )
Мне интересна логика сортировки.
...
Рейтинг: 0 / 0
Сортировка типа interval
    #39795013
Melkij
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_stas_k_,

сортировка интервалов штука относительно простая. Интервал пересчитывается в int128 и сравнивается.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
WITH data as (
 SELECT '2019-03-31 22:00'::timestamp as dt
 UNION ALL SELECT '2019-03-31 18:30'
 UNION ALL SELECT '2019-04-01 21:00'
)
SELECT dt, age(dt,'2019-01-01') as a,
extract(epoch from age(dt,'2019-01-01')) as interval_len,
dt - timestamp '2019-01-01' as interval_difference
FROM data
ORDER BY interval_difference;


Вот так можно заметить, что интервалы сортируются корректно. А вот вызов age даёт фокус.
...
Рейтинг: 0 / 0
Сортировка типа interval
    #39795075
Павел Лузанов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_stas_k_,

Дело не в сортировке интервалов, а в том, что выдает функция age.
А она "... выдаёт «символический» результат ..." (на той же странице документации).
...
Рейтинг: 0 / 0
Сортировка типа interval
    #39795122
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Павел Лузанов_stas_k_,

Дело не в сортировке интервалов, а в том, что выдает функция age.
А она "... выдаёт «символический» результат ..." (на той же странице документации).

этто немноошко странное уттверждение

а именно ф-я возвращает тип "интервал", и сравниваются интервалы

но вот этот тип испорчен "символьными" вариациями, "месяц" и "год" имеющими неопределенную длительность (определяемую по месту приложения) и для целей сравнения (не в составе даты) приводимые к некой средней цифре (30 для месяца) в днях.

поэтому правильнее для сравнения пользоваться только стабильными "литералами" интервалов. (без годов и месяцев)
а вариации нестабильные использовать там, где они нужны -- для годовых и месячных сдвигов.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
WITH data as (
SELECT '2019-03-31 22:00'::timestamp as dt
UNION ALL SELECT '2019-03-31 18:30'
UNION ALL SELECT '2019-04-01 21:00'
)
SELECT dt, age(dt,'2019-01-01') as a
,dt - timestamp'2018-01-01' as b
FROM data
ORDER BY b; 
...
Рейтинг: 0 / 0
Сортировка типа interval
    #39795279
_stas_k_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Низкий поклон за разъяснения!
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Сортировка типа interval
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]