Em 15/12/08, Osvaldo Kussama<[email protected]> escreveu:
> 2008/12/15, Rogério A Bassete <[email protected]>:
>> Pessoal,
>>
>> dados da tabela vigencia:
>>
>> Data_Inicial       Data_Final
>> 01/11/2008         03/11/2008
>> 04/11/2008         30/11/2008
>> 01/12/2008         03/12/2008
>> 05/12/2008         31/12/2008
>>
>>
>> Gostaria de um select que me retorna true caso o intervalo pesquisado
>> seja: 01/11/2008 a 30/11/2008 e false caso o intervalo seja 01/12/2008 a
>> 31/12/2008 (falta o dia 04/12/2008).
>>


Verifique se é isto:
bdteste=# CREATE TEMP TABLE foo(
bdteste(#    Data_Inicial date,
bdteste(#    Data_Final date);
CREATE TABLE
bdteste=#
bdteste=# INSERT INTO foo VALUES('2008-11-01'::date,
'2008-11-03'::date), ('2008-11-04'::date, '2008-11-10'::date),
('2008-12-01'::date, '2008-12-03'::date), ('2008-12-05'::date,
'2008-12-10'::date);
INSERT 0 4
bdteste=#
bdteste=# SELECT * FROM foo;
 data_inicial | data_final
--------------+------------
 2008-11-01   | 2008-11-03
 2008-11-04   | 2008-11-10
 2008-12-01   | 2008-12-03
 2008-12-05   | 2008-12-10
(4 registros)

bdteste=# \set per_ini '\'2008-11-01\'::date'
bdteste=# \set per_fim '\'2008-11-10\'::date'
bdteste=#
bdteste=# SELECT
(Data_Inicial+generate_series(0,Data_Final-Data_Inicial))::date FROM
foo WHERE Data_Inicial >= :per_ini AND Data_Final <= :per_fim;
    date
------------
 2008-11-01
 2008-11-02
 2008-11-03
 2008-11-04
 2008-11-05
 2008-11-06
 2008-11-07
 2008-11-08
 2008-11-09
 2008-11-10
(10 registros)

bdteste=#
bdteste=# SELECT (count(*) > 0) AS "Tem buraco" FROM
bdteste-#    (SELECT (:per_ini+(generate_series(0,:per_fim-:per_ini)))::date
bdteste(#     EXCEPT
bdteste(#     SELECT
(Data_Inicial+generate_series(0,Data_Final-Data_Inicial))::date
bdteste(#       FROM foo WHERE Data_Inicial >= :per_ini AND Data_Final
<= :per_fim) AS bar;
 Tem buraco
------------
 f
(1 registro)

bdteste=#
bdteste=# \set per_ini '\'2008-12-01\'::date'
bdteste=# \set per_fim '\'2008-12-10\'::date'
bdteste=# SELECT
(Data_Inicial+generate_series(0,Data_Final-Data_Inicial))::date FROM
foo WHERE Data_Inicial >= :per_ini AND Data_Final <= :per_fim;
    date
------------
 2008-12-01
 2008-12-02
 2008-12-03
 2008-12-05
 2008-12-06
 2008-12-07
 2008-12-08
 2008-12-09
 2008-12-10
(9 registros)

bdteste=#
bdteste=# SELECT (count(*) > 0) AS "Tem buraco" FROM
bdteste-#    (SELECT (:per_ini+(generate_series(0,:per_fim-:per_ini)))::date
bdteste(#     EXCEPT
bdteste(#     SELECT
(Data_Inicial+generate_series(0,Data_Final-Data_Inicial))::date
bdteste(#       FROM foo WHERE Data_Inicial >= :per_ini AND Data_Final
<= :per_fim) AS bar;
 Tem buraco
------------
 t
(1 registro)

Osvaldo
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a