Как определить последний день предыдущего месяца, используя PostgreSQL? - PullRequest
9 голосов
/ 20 января 2012

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

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

Ответы [ 6 ]

15 голосов
/ 20 января 2012

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

Для столбца date:

SELECT *
FROM   tbl
WHERE  my_date BETWEEN date_trunc('month', now())::date - 1
               AND     now()::date

Вы можете вычесть простые целочисленные значения из date (но не из timestamp), чтобы вычесть дни. Это самый простой и быстрый способ.

Для столбца timestamp:

SELECT *
FROM   tbl
WHERE  my_timestamp >= date_trunc('month', now()) - interval '1 day'
AND    my_timestamp <  date_trunc('day'  , now()) + interval '1 day'

Обратите внимание, что я использую оператор < для второго условия, чтобы получить точные результаты (~ "до завтра").

Я не приведу к date во втором запросе. Вместо этого я добавляю interval '1 day', чтобы не читать туда-сюда.

Ознакомьтесь с типами даты / времени и функций в руководстве.

4 голосов
/ 05 декабря 2012

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

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

2 голосов
/ 20 января 2012

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

SELECT ...
WHERE  date_field between (date_trunc('MONTH', now()) - INTERVAL '1 day')::date 
                      and now()::date 
       ...
0 голосов
/ 01 февраля 2017

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

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

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

Образцы казней:

SELECT *FROM fn_GetLastDayOfMonth(NOW()::DATE);
0 голосов
/ 06 сентября 2013

взять от 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', $1) + INTERVAL '1 MONTH - 1         day')::date);
    $$ LANGUAGE 'sql' IMMUTABLE STRICT;


    select calc_days_in_month('1999-05-01')

возвращает 31

0 голосов
/ 20 января 2012

Попробуйте

select current_date - cast((date_part('day', current_date) + 1) as int)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...