[MSSQL2005]Zapytanie o produkcje w przedziale czasowym

0

Witam,
Mam problem z zapytaniem sql które będzie zwracać rekordy w określonym przez użytkownika przedziale czasowym. Chciałbym np. zobaczyć produkcję od 2009-09-01 od godziny 2200 do 2009-09-03 do godziny 0600.
Przy zastosowaniu kwerendy nr.1 jako wynik uzyskuje rekordy od 2009-09-01 2200 do 2009-09-03 0600 zamiast 3 przedziałów po 8 godzin.
Przy zastosowaniu kwerendy nr.2 nie otrzymuje żadnego wyniku.
Może ktoś jest w stanie napisać taką kwerendę która rozwiąże mój problem.
Pozdrawiam
Jacek
Poniżej rozwiązania które jak na razie stosuje ale bez powodzenia:
//------------querry no. 1--------------------
d1:= FormatDateTime('yyyy-MM-dd',DateTimePicker1.DateTime)+' '+'0000';
d2:= FormatDateTime('yyyy-MM-dd',DateTimePicker2.DateTime)+' '+'0000';
c1:= '1900-01-01'+' '+FormatDateTime('HHss',DateTimePicker3.Time);
c2:= '1900-01-01'+' '+FormatDateTime('HHss',DateTimePicker4.Time);
with ADOQuery1, SQL do
begin
Close;
Clear;
Add('SELECT * FROM WAGA1 WHERE DATA BETWEEN (Convert(DateTime, :data_od)) AND (Convert(DateTime, :data_do)) AND CZAS >= (Convert(DateTime, :czas_od)) AND CZAS <= (Convert(DateTime,:czas_do)) ORDER BY RAPORT ASC');
Params.ParamByName('data_od').AsString := d1;
Params.ParamByName('data_do').AsString := d2;
Params.ParamByName('czas_od').AsString := c1;
Params.ParamByName('czas_do').AsString := c2;
Open;
end;
//----------------querry no.2---------------------
add('SELECT * FROM WAGA1 WHERE DATA BETWEEN (Convert(DateTime, :data_od)) AND (Convert(DateTime, :data_do)) AND CZAS BETWEEN (Convert(DateTime, :czas_od)) AND (Convert(DateTime,:czas_do))');
Params.ParamByName('data_od').AsString := d1;
Params.ParamByName('data_do').AsString := d2;
Params.ParamByName('czas_od').AsString := c1;
Params.ParamByName('czas_do').AsString := c2;

0

a dlaczego data i czas są w osobnych kolumnach??

0

Ponieważ cały czas testuje rozwiązania, jak zauważyłeś jest CZAS,DATA I RAPORT ( data + czas ) i jak na razie ani ja ani nikt ze znajomych ludzi nie potrafi mi pomóc.
Wydaje się to prostym problemem ale w rzeczywistości chyba takim nie jest.
Jeżeli mogę jeszcze przekazać wam dodatkowe informacje to proszę o info.
Poniżej zamieszczam przykładowe dane:

ID MASA RATE DATA CZAS RAPORT
115466 1,795 574,719 2009-09-01 0000.000 1900-01-01 2238.000 2009-09-01 2238.000
115467 1,793 595,719 2009-09-01 0000.000 1900-01-01 2248.000 2009-09-01 2248.000
115468 1,794 619,719 2009-09-01 0000.000 1900-01-01 2258.000 2009-09-01 2258.000
115469 1,793 560,719 2009-09-01 0000.000 1900-01-01 2208.000 2009-09-01 2208.000
115470 1,793 530,719 2009-09-01 0000.000 1900-01-01 2218.000 2009-09-01 2218.000
115471 1,794 569,719 2009-09-01 0000.000 1900-01-01 2228.000 2009-09-01 2228.000
115472 1,792 539,719 2009-09-01 0000.000 1900-01-01 2238.000 2009-09-01 2238.000

0

no to jeśli w kolumnie raport jest ZAWSZE data i czas poprawny no to

add('SELECT * FROM WAGA1 WHERE raport BETWEEN (:data_od AND :data_do)');
Params.ParamByName('data_od').AsDateTime := Trunc(DateTimePicker1.DateTime) + Frac(DateTimePicker3.Time) 
Params.ParamByName('data_do').AsDateTime := Trunc(DateTimePicker2.DateTime) + Frac(DateTimePicker4.Time) 

natomiast nie rozumiem

zamiast 3 przedziałów po 8 godzin.

najlepiej daj przykładowe dane i wynik, jaki chcesz uzyskać

0

Witam,
Program który pisze służy do raportowania produkcji. Klient ma możliwość wyboru dowolnej daty i czasu po którym chce filtrować wyniki. Cały problem wiąże się z 3 zmianą która pracuje od godziny 22:00 do 06:00.
Wyżej popełniłem błąd ponieważ filtrując bazę przy ustawieniach daty od 2009-09-01 od godziny 2200 do 2009-09-03 do godziny 0600 powinienem uzyskać 16h pracy czyli pierwszy przedział od 2009-09-01 do 2009-09-02 od 22:00 do 6:00 i drugi przedział od 2009-09-02 do 2009-09-03 od 22:00 do 06:00. W sumie powinienem uzyskać 16h pracy.
Interesują mnie tylko te przedziały ponieważ chce znać ile wyprodukowała 3 zmiana.

Jeżeli klient wybierze datę od 2009-09-14 do 2009-09-18 i godzinę od 0600 do 1400 to powinienem wyfiltrować wyniki tylko z tych przedziałów ( czyli godziny od 0600 do 14:00 każdego dnia pomiędzy 14 a 19 września). W sumie daje to 5 dni pracy od godziny 6 do 14 czyli 40h.

Mam nadzieje że teraz trochę bardziej przybliżyłem Ci mój problem.
Pozdrawiam i dziękuje za niesienie pomocy nieoświeconym :)

0

Dla 1 i 2 zmiany poprawnie działa następujący SELECT:

Add('SELECT ID,MASA,RATE,DATA,CZAS,RAPORT FROM WAGA1  WHERE DATA >= Convert(DateTime, :data_od) AND DATA <= Convert(DateTime, :data_do) '+
        'AND CZAS BETWEEN Convert(DateTime, :czas_od) AND  Convert(DateTime, :czas_do) ORDER BY DATA ASC,CZAS ASC');

Filtruje dokładnie tak jak tego oczekuje niestety przy 3 zmianie szlak go trafia i zwraca 0 rekordów.
poniżej wykres jak to wygląda dla filtracji od 2009-09-01 do 2009-09-03 dla 1 zmiany czyli od 06:00 do 14:00

http://img195.imageshack.us/i/produkcja.jpg/

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