Как определить последний день предыдущего месяца с помощью PostgreSQL?

Мне нужно запросить базу данных PostgreSQL, чтобы определить записи, которые попадают в сегодняшнюю дату и последний день предыдущего месяца. Другими словами, Я хотел бы получить все, что приходится на период с 31 декабря 2011 года по сегодняшний день. Этот запрос будет повторно использоваться каждый месяц, поэтому в следующем месяце запрос будет основан на текущей дате и 31 января 2012 года.

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

6 ответов


оба решения включить последний день предыдущего месяца, а также включить все "сегодня".

на


для получения дата предыдущий/прошлый месяц:

SELECT (date_trunc('month', now())::date - 1) as last_month_date

результат: 2012-11-30

для получения количество дней предыдущий/прошлый месяц:

SELECT DATE_PART('days', date_trunc('month', now())::date - 1) last_month_days

результат: 30


попробуйте это:

SELECT ...
WHERE  date_field between (date_trunc('MONTH', now()) - INTERVAL '1 day')::date 
                      and now()::date 
       ...

попробовать

select current_date - cast((date_part('day', current_date) + 1) as int)

взять из http://wiki.postgresql.org/wiki/Date_LastDay, и изменен, чтобы вернуть только дни в месяц

    CREATE OR REPLACE FUNCTION calc_days_in_month(date)
    RETURNS double precision AS
    $$
      SELECT EXTRACT(DAY FROM (date_trunc('MONTH', ) + INTERVAL '1 MONTH - 1         day')::date);
    $$ LANGUAGE 'sql' IMMUTABLE STRICT;


    select calc_days_in_month('1999-05-01')

возвращает 31


ссылка взята из этого блога:

вы можете использовать функцию ниже:

CREATE OR REPLACE FUNCTION fn_GetLastDayOfMonth(DATE)
RETURNS DATE AS
$$
    SELECT (date_trunc('MONTH', ) + INTERVAL '1 MONTH - 1 day')::DATE;
$$ LANGUAGE 'sql' 
IMMUTABLE STRICT;

образец казней:

SELECT *FROM fn_GetLastDayOfMonth(NOW()::DATE);