Если я просматриваю данные за первые 10 дней месяца, как я могу также просмотреть данные за первые 10 дней предыдущего месяца?

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

Примере:

Сейчас 10/11, и я вижу данные за октябрь. Я бы видел все с 10/1 по 10/11.

Затем я также хочу посмотреть, как выглядели данные с 1 сентября по 11 сентября.

Могу ли я использовать функции Interval и / или date_trunc?

0
Hyder W 11 Окт 2019 в 21:30

2 ответа

Да, вы можете использовать date_trunc, чтобы перейти к началу месяца, и вы можете вычесть интервал в 1 месяц, чтобы получить последний месяц:

postgres=# select now(), date_trunc('month', now()) as start_of_month, now() - interval '1 month' as last_month, date_trunc('month', now() - interval '1 month') as start_of_last_month;
              now              |     start_of_month     |          last_month           |  start_of_last_month
-------------------------------+------------------------+-------------------------------+------------------------
 2019-10-11 18:57:22.385666+00 | 2019-10-01 00:00:00+00 | 2019-09-11 18:57:22.385666+00 | 2019-09-01 00:00:00+00
(1 row)

0
Jeremy 11 Окт 2019 в 21:58
Но это не дает мне всех данных за период с 1 октября по 11 сентября, а затем за все данные за период с 1 сентября по 11 сентября, не так ли?
 – 
Hyder W
14 Окт 2019 в 16:36
Вот как вы рассчитываете даты. Вы можете присоединиться к этим расчетным датам, но, ничего не зная о ваших таблицах или данных, я не могу показать вам, как это сделать.
 – 
Jeremy
14 Окт 2019 в 17:22

Вот как я его "взломал":

select x.now, count(x.status) as total
from
(
    select now(), date_trunc('month', now()) as start_of_month, now() - 
interval '1 month' as last_month
    , date_trunc('month', now() - interval '1 month') as 
start_of_last_month, status
    , created_date
    from my_table
)x
where x.created_date between x.start_of_month and x.now
group by x.now

UNION ALL

select x.last_month, count(x.status) as total
from
(
    select now(), date_trunc('month', now()) as start_of_month, now() - 
interval '1 month' as last_month
    , date_trunc('month', now() - interval '1 month') as 
start_of_last_month, status
    , created_date
    from my_table
)x
where x.created_date between x.start_of_last_month and x.last_month
group by x.last_month

Используя «UNION ALL» , я заменил «x.now» на «x.last_month» в временном интервале даты select и where, чтобы теперь у меня есть текущий месяц (где бы я ни находился) и то же самое для предыдущего месяца

0
Hyder W 15 Окт 2019 в 00:04