Você pode usar
date_trunc('week', ...)
. Por exemplo:
SELECT date_trunc('week', '2012-07-25 22:24:22'::timestamp);
-> 2012-07-23 00:00:00
Em seguida, você pode converter isso em uma data, se não estiver interessado em um horário de início.
Para obter a data de término também:
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
(Eu usei a formatação padrão aqui, você pode adaptar isso para usar MM/DD/AAAA.)
Observe que, se você quiser fazer comparações em timestamps, em vez de usar
(date_trunc('week', ...) + '6 days'::interval
, convém adicionar uma semana inteira e usar uma comparação estrita para o final da semana. Isso excluirá
y
timestamps no último dia da semana (já que o horário de corte é meia-noite do dia). date_trunc('week', x)::date <= y::timestamp
AND y::timestamp <= (date_trunc('week', x) + '6 days'::interval)::date
Isso os incluirá:
date_trunc('week', x)::date <= y::timestamp
AND y::timestamp < (date_trunc('week', x) + '1 week'::interval)
(Isso é nos raros casos em que você não pode usar
date_trunc
em y
diretamente.) Se sua semana começa em um domingo, substituindo
date_trunc('week', x)::date
com date_trunc('week', x + '1 day'::interval)::date - '1 day'::interval
Deveria trabalhar.