Zawieranie okresu dat między datą od, a datą do

0

Witam,
Zdefiniowałem sobie prostą tabelkę, posiadającą następujące kolumny:

Wygenerowany DDL (Postgres):

CREATE SEQUENCE tst_tst_id_seq;
CREATE TABLE tst (
                tst_id BIGINT NOT NULL DEFAULT nextval('tst_tst_id_seq'),
                dataod VARCHAR NOT NULL,
                datado DATE NOT NULL,
                CONSTRAINT tst_id PRIMARY KEY (tst_id)
);
ALTER SEQUENCE tst_tst_id_seq OWNED BY tst.tst_id;
</codel>

Chcę wybrać wszystkie rekordy zawierające w sobie datę od i datę do. To zadanie powinno być dość proste, ale mam z nim problem.

Napisałem takie query:
```sql
SELECT * FROM tst WHERE tst.dataod >= '1985-12-20' AND tst.datado <= '1995-12-20';

Nie uwzględnia jednak dat znajdujących się w zewnętrznym przedziale, a które zawierają podany czas (tzn. od '1985-12-20' do '1995-12-20').

Podsumowując, chcę wybrać z tabeli wszystkie daty, które posiadają w sobie podany okres czasu. Będę wdzięczny za podpowiedź.

0

dataod to VARCHAR i pewnie tutaj tkwi problem. Sprawdź też czy nie zapisujesz do bazy daty z godzinami wtedy i w filtrze trzeba zadbać o godziny przynajmniej dla datado.

0
  1. data ma być jako data
  2. jak porównujesz daty, które są z czasem to albo daty brzegowe muszą być z czasem (od z czasem 0000 a do z 2359) albo porównujesz bez czasu, np robiąc trunc na datach z bazy
0

nie wiem co za baza ale w psotgresie ja bym zrobil:

where tst.dataod::date >=  '1985-12-30' and tst.datado::date <= '1995-12-20'
0

Ja myślę, że chodzi mu o coś innego. Przykład poniżej. Radzę pozmieniać "parametry".

/*
begin;

create temp table _mm_test
(
id serial not null primary key,
data_od date not null,
data_do date not null
)
on commit drop;

INSERT INTO _mm_test(data_od, data_do)
select 
	 ('2014-06-01'::date + x* (interval '1 day'))::date data_od, 
	(('2014-06-01'::date + x* (interval '1 day'))::date+y*(interval '1 day')) data_do
from 
	generate_series(3, 8) x(x), 
	generate_series(4,14) y(y)
;
*/

with parametry as
(select 
	'2014-06-21'::date start_data,
	'2014-06-27'::date end_data
)
select * from _mm_test, parametry where data_od<end_data and data_do>start_data

1 użytkowników online, w tym zalogowanych: 0, gości: 1