Marcelo Magno escreveu:
> Oswaldo, acho que nao estou pescando algum feature desse overlaps...
>
> nessa query abaixo, pra mim existe uma sobreposicao, que seria
> justamente o dia 01/03 mas ele me retorna falso... tem alguma
> particularidade que não esta escrita no manual ?
>
> select
> (to_date('01/03/2008','DD/MM/YYYY'),to_date('31/05/2008','DD/MM/YYYY'))
> overlaps
> (to_date('01/01/2008','DD/MM/YYYY'),to_date('01/03/2008','DD/MM/YYYY'))
>
> Fico grato se puder me ajudar,
>
> Abracos,
> Marcelo Magno
>
> On Tue, 2007-07-10 at 09:30 -0300, Marcelo Magno wrote:
>> muitissimo obrigado oswaldo...
>>
>> Abs,
>> Marcelo Magno
>>
>> On Mon, 2007-07-09 at 17:18 -0300, Osvaldo Rosario Kussama wrote:
>>> Marcelo Magno escreveu:
>>> > Boa tarde pessoal,
>>> >
>>> > Eu estou tendo alguma dificuldade para lidar com conjuntos de datas. No
>>> > meu caso, eu tenho em cada tupla da tabela a informacao de data inicial
>>> > e data final. Quando um usuario entra um periodo (digamos de hoje ate
>>> > semana que vem) eu preciso fazer uma especie de intersessao dos dois
>>> > conjuntos de datas e caso exista essa intersessao, retornar essa tupla.
>>> >
>>> > Eu estava usando uma script em pl-sql que fazia um loop dia a dia, mas
>>> > por motivos de lentidao, estou procurando outra metodologia...
>>> >
>>> > Eu até consigo gerar os periodos usando a funcao generate_series, mas
>>> > parei por ai... nao estou conseguindo progredir... Existe alguma forma
>>> > de comparar conjuntos no where ? queria comparar o periodo entre data
>>> > inicial e final da tupla, como os periodos entrado pelo usuario.
>>> >
>>> > Em outras ocasioes eu já usei de comparacoes de datas para achar as
>>> > intersessoes, mas essa metodologia é dificil de debugar e estou querendo
>>> > fugir dela no momento.
>>> >
>>> > Se alguem puder me dar uma luz diferente, fico grato.
>>> >
>>>
>>>
>>> Veja o operador OVERLAPS em:
>>> http://www.postgresql.org/docs/8.2/interactive/functions-datetime.html
>>>
É a definição do operador OVERLAPS (como ele considera os limites dos
intervalos). Veja os exemplos abaixo:
bdteste=# SELECT * FROM t_dates;
id | sd1 | ed1 | sd2 | ed2
----+------------+------------+------------+------------
1 | 08/07/2007 | 08/07/2007 | 08/07/2007 | 08/07/2007
2 | 07/07/2007 | 08/07/2007 | 08/07/2007 | 08/07/2007
3 | 08/07/2007 | 08/07/2007 | 08/07/2007 | 09/07/2007
4 | 07/07/2007 | 08/07/2007 | 08/07/2007 | 09/07/2007
5 | 08/07/2007 | 08/07/2007 | 07/07/2007 | 08/07/2007
(5 registros)
bdteste=# SELECT *, (sd1,ed1) OVERLAPS (sd2,ed2) FROM t_dates;
id | sd1 | ed1 | sd2 | ed2 | overlaps
----+------------+------------+------------+------------+----------
1 | 08/07/2007 | 08/07/2007 | 08/07/2007 | 08/07/2007 | t
2 | 07/07/2007 | 08/07/2007 | 08/07/2007 | 08/07/2007 | f
3 | 08/07/2007 | 08/07/2007 | 08/07/2007 | 09/07/2007 | t
4 | 07/07/2007 | 08/07/2007 | 08/07/2007 | 09/07/2007 | f
5 | 08/07/2007 | 08/07/2007 | 07/07/2007 | 08/07/2007 | f
(5 registros)
Talvez o resultado desejado seja alcançado com o operador BETWEEN:
bdteste=# SELECT *, (sd1,ed1) OVERLAPS (sd2,ed2), ((sd1 BETWEEN sd2 AND
ed2) OR (ed1 BETWEEN sd2 AND ed2)) AS x FROM t_dates;
id | sd1 | ed1 | sd2 | ed2 | overlaps | x
----+------------+------------+------------+------------+----------+----------
1 | 08/07/2007 | 08/07/2007 | 08/07/2007 | 08/07/2007 | t | t
2 | 07/07/2007 | 08/07/2007 | 08/07/2007 | 08/07/2007 | f | t
3 | 08/07/2007 | 08/07/2007 | 08/07/2007 | 09/07/2007 | t | t
4 | 07/07/2007 | 08/07/2007 | 08/07/2007 | 09/07/2007 | f | t
5 | 08/07/2007 | 08/07/2007 | 07/07/2007 | 08/07/2007 | f | t
(5 registros)
Se for este o caso você pode, para evitar a repetição do segundo
período, fazer uma função como:
CREATE OR REPLACE FUNCTION
overlaps_inclusive(date, date, date, date) RETURNS bool AS
$$
SELECT (($1 BETWEEN $3 AND $4) OR ($2 BETWEEN $3 AND $4));
$$ LANGUAGE SQL;
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral