как рассчитать только дни между двумя датами в запросе postgres sql.

Предположим, я указал две даты, если разница составляет один месяц, тогда она должна отображаться как 30 дней. Даже месяцы также необходимо преобразовать в дни, которые я пробовал с возрастом (date, now () :: timestamp без часового пояса), но это с указанием формата месяцев-дат-лет. Пример: 10 мес 24 дня 13: 57: 40.5265 Но мне нужен следующий способ. Например, если разница в два месяца, мне нужно выводить как 60 дней.


person suresh    schedule 07.04.2017    source источник
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
comment
age() возвращает interval не символический результат. Это тип данных, который можно очень легко использовать в расчетах и ​​определенно не бессмысленный. - person a_horse_with_no_name; 07.04.2017
comment
@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