Подтвердить что ты не робот

Как получить начальную и конечную даты недели в PostgreSQL?

Я использую PostgreSQL 8.3. У меня есть таблица вроде этого:

id        regist_time        result
-----------------------------------
1     2012-07-09 15:00:08      3
2     2012-07-25 22:24:22      7
4     2012-07-07 22:24:22      8

regist_time тип данных timestamp.

Мне нужно найти недельный интервал (от начала до конца) и сумма (результат) в виде числа.

Я хочу получить результат как:

      week                    num    
---------------------------------
7/1/2012-7/7/2012              10
7/8/2012-7/14/2012              5
7/15/2012-7/21/2012             3
7/22/2012-7/28/2012            11

Я могу получить номер недели только в этом году:

SELECT id,regis_time, EXTRACT(WEEK FROM regis_time) AS regweek
FROM tba

Ключевая часть

EXTRACT(WEEK FROM regis_time) 

функция извлечения может получить только номер недели в этом году, как я могу получить время начала до конца в течение одной недели?

4b9b3361

Ответ 1

Вы можете использовать date_trunc('week', ...).

Например:

SELECT date_trunc('week', '2012-07-25 22:24:22'::timestamp);
-> 2012-07-23 00:00:00

Затем вы можете преобразовать это в дату, если вам не интересно время начала.

Получить дату окончания тоже:

SELECT    date_trunc('week', '2012-07-25 22:24:22'::timestamp)::date
   || ' '
   || (date_trunc('week', '2012-07-25 22:24:22'::timestamp)+ '6 days'::interval)::date;

-> 2012-07-23 2012-07-29

(Я использовал форматирование по умолчанию здесь, вы можете, конечно, адаптировать его для использования MM/DD/YYYY.)

Обратите внимание, что если вы хотите сделать сравнения на отметках времени, вместо использования (date_trunc('week', ...) + '6 days'::interval, вы можете добавить целую неделю и использовать строгое сравнение в конце недели.

Это исключает отметки времени y в последний день недели (так как время отключения составляет полночь в день).

    date_trunc('week', x)::date <= y::timestamp
AND y::timestamp <= (date_trunc('week', x) + '6 days'::interval)::date

Это будет включать их:

    date_trunc('week', x)::date <= y::timestamp
AND y::timestamp < (date_trunc('week', x) + '1 week'::interval)

(Это в редких случаях, когда вы не можете напрямую использовать date_trunc on y.)


Если ваша неделя начинается в воскресенье, замена date_trunc('week', x)::date на date_trunc('week', x + '1 day'::interval)::date - '1 day'::interval должна работать.

Ответ 2

select date_trunc('week', regist_time)::date || ' - ' ||
       (date_trunc('week', regist_time) + '6 days') ::date as Week,
       sum(result) Total
from YourTable
group by date_trunc('week', regist_time)
order by date_trunc('week', regist_time)

См. доказательство концепции в SQLFiddle: http://sqlfiddle.com/#!1/9e821/1

Ответ 3

Это

select to_date('2015-07', 'IYYY-IW');

использовать его в postgres

он вернет

2015-02-09

Ответ 4

Это может помочь, запрос на получение всех дней текущей недели.

select cast(date_trunc('week', current_date) as date) + i
from generate_series(0,6) i

2015-08-17
2015-08-18
2015-08-19
2015-08-20
2015-08-21

Чтобы получить начальную и конечную дату недели (как 0 для понедельника и 4 для пятницы):

select cast(date_trunc('week', current_date) as date) + 0 || '-->' ||  cast(date_trunc('week', current_date) as date) + 4;

2015-08-17 → 2015-08-21