Предположим, я указал две даты, если разница составляет один месяц, тогда она должна отображаться как 30 дней. Даже месяцы также необходимо преобразовать в дни, которые я пробовал с возрастом (date, now () :: timestamp без часового пояса), но это с указанием формата месяцев-дат-лет. Пример: 10 мес 24 дня 13: 57: 40.5265 Но мне нужен следующий способ. Например, если разница в два месяца, мне нужно выводить как 60 дней.
как рассчитать только дни между двумя датами в запросе postgres sql.
comment
что ты уже испробовал? Вы можете показать код?
- person Daniele D.   schedule 07.04.2017
comment
Но разница между одним и тем же днем в феврале и марте составляет 28 или 29 дней? А разница между одним и тем же днем в марте и апреле составляет 31 день. Даже если вы извлечете количество дней, вы не получите 30 дней для каждого сравнения месяца с месяцем.
- person Scott Marlowe   schedule 07.04.2017
comment
Обратите внимание, что в 9.6.1 я получаю дни для этого запроса: выберите '2017-10-03 00:00:00' :: timestamp - '2017-02-03 00:00:00' :: timestamp; ?столбец? ---------- 242 дня
- person Scott Marlowe   schedule 07.04.2017
Ответы (2)
Не используйте функцию age()
для арифметики даты и времени. Он только возвращает "символические" результаты (которые достаточно хороши для человеческое представление, но почти бессмысленное для вычислений даты / времени; по сравнению со стандартной разницей).
Стандартный оператор разницы (-
) возвращает результаты за день для оба date
, timestamp
и timestamp with time zone
(первый возвращает дни как int
, последние два возвращают interval
на основе дней):
Из дневных интервалов вы можете извлечь дни с помощью функции extract()
:
select current_date - '2017-01-01',
extract(day from now()::timestamp - '2017-01-01 00:00:00'),
extract(day from now() - '2017-01-01 00:00:00Z');
http://rextester.com/RBTO71933
person
pozs
schedule
07.04.2017
age()
возвращает interval
не символический результат. Это тип данных, который можно очень легко использовать в расчетах и определенно не бессмысленный.
- person a_horse_with_no_name; 07.04.2017
@a_horse_with_no_name из документов возраст (временная метка, timestamp): вычесть аргументы, получая символический результат, в котором используются годы и месяцы, а не только дни, да, технически его тип -
interval
, но с учетом его (функции) семантики и общих interval
правил согласования это не означает для использования в арифметике даты / времени (возможно, в некоторых крайних случаях).
- person pozs; 07.04.2017
Оба они дадут такой результат.
select make_interval(days => ((extract(epoch from '2016-04-10'::date) - extract(epoch from '2016-02-10'::date))/(60*60*24))::integer)::text;
select format('%1$s days', ((extract(epoch from '2016-04-10'::date) - extract(epoch from '2016-02-10'::date))/(60*60*24))::integer);
person
Łukasz Kamiński
schedule
07.04.2017