Pobieranie danych z bazy na podstawie zakresu daty

0

Witam, mam pytanie jak zrobić odpowiednie zapytanie w ADOQuery - łączę się z Accessem. Na razie działa mi jedynie jeśli Data Od i **Data Do ** jest identyczna. Nie wiem jak zmienić, żeby tak samo pokazywało, że samochód jest zajęty jeśli ktoś poda daty z przedziału OD - DO. Próbowałem to zrobić też przy pomocy BETWEEN, ale z marnym skutkiem.

   begin
  ADOQuery1.SQL.Text:='SELECT * FROM Wypozyczenia WHERE ID_Samochod=CInt('''+lbledtRezerwacja.Text+''') and Wypozyczenia.Data_wypozyczenia>=CDate('''+DateTOStr(dtpOd.Date)+''') and Wypozyczenia.Data_planowanego_zwrotu<=CDate('''+DateToStr(dtpDo.Date)+''')';
  ShowMessage(DateTOStr(dtpOd.Date));
  ShowMessage(DateTOStr(dtpDo.Date));
  ADOQuery1.Active:=True;
  ADOQuery1.First;
  ShowMessage(IntToStr(ADOQuery1.RecordCount));
  if(ADOQuery1.RecordCount>0) then
  begin
    ShowMessage('Samochód zajęty');
  exit;
  end else
0

Bo w Accessie datę musisz objąć # i podać w formacie mm/dd/yyyy (nie, nie pomyliłem się pierwszy ma być miesiąc)

czyli na 19 grudnia:

#12/19/2016# BETWEEN Wypozyczenia.Data_wypozyczenia AND Wypozyczenia.Data_planowanego_zwrotu
0

Tylko ten kod co teraz mam zapisany. Poprawnie mi działa jeśli mam dwie takie same daty rezerwacji to pokazuje mi, że jest zajęta. Gorzej jeśli mam rezerwacje np. od 20.12.2016 do 25.12.2016, a wpiszę 22.12.2016 do 25.12.2016

0

Teraz się przyjrzałem, sam warunek sprawdzi się tylko jeżeli sprawdzany zakres będzie dokładnie w okresie sprawdzanym, tu by trzeba chyba tak:

SELECT 
    * 
FROM 
    Wypozyczenia 
WHERE 
    ID_Samochod=1
   and (
       #22/19/2016# BETWEEN Wypozyczenia.Data_wypozyczenia AND Wypozyczenia.Data_planowanego_zwrotu
       or
       #25/19/2016# BETWEEN Wypozyczenia.Data_wypozyczenia AND Wypozyczenia.Data_planowanego_zwrotu      
   )

I dla tego zakresu Twój też powinien się zgadzać, ale zmień format, obłóż # koniecznie w tym formacie i zobacz co będzie, dodatkowo wartości int nie muszą być konwertowane i nie wymagaja ' przy podawaniu wartości.

Zapytam przezornie czy pola data_wypozyczenia i data_planowanego zwrotu sa typu datowego?

Jak możesz daj bazę z tabela wypożyczenia

0

Dzięki za pomoc, teraz działa jak trzeba :)

 ADOQuery1.SQL.Text:='SELECT * FROM Wypozyczenia WHERE ID_Samochod=CInt('''+lbledtRezerwacja.Text+''') and  CDate('''+DateTOStr(dtpOd.Date)+''') BETWEEN Wypozyczenia.Data_wypozyczenia AND Wypozyczenia.Data_planowanego_zwrotu or CDate('''+DateToStr(dtpDo.Date)+''') BETWEEN Wypozyczenia.Data_wypozyczenia and Wypozyczenia.Data_planowanego_zwrotu';
0

Zapomniałeś o nawiasach

 ADOQuery1.SQL.Text:='SELECT * FROM Wypozyczenia WHERE ID_Samochod=CInt('''+lbledtRezerwacja.Text+''') 
and  (CDate('''+DateTOStr(dtpOd.Date)+''') BETWEEN Wypozyczenia.Data_wypozyczenia AND Wypozyczenia.Data_planowanego_zwrotu or CDate('''+DateToStr(dtpDo.Date)+''') BETWEEN Wypozyczenia.Data_wypozyczenia and Wypozyczenia.Data_planowanego_zwrotu)';
0

Jeszcze chciałem zapytać jak prostym sposobem policzyć ilość dni z przedziału dwóch dat?

0

Jeszcze mam pytanie odnośnie tego DateDiff. Jeśli np. mam tabele: dataOD, dataDO, ilosc_dni to jak w accessie zapisac ilość dni między tymi dwoma datami ?

0

W linku masz przykład, w czym masz problem?

0

Chciałem, żeby do głównej tabeli w accesie gdzie mam kolumnę Ilość_dni wpisało mi wynik tej kwerendy.

 SELECT DateDiff("d",Data_wypozyczenia,Data_faktycznego_zwrotu) AS Ilosc_dni
FROM Wypozyczenia;
0
Update wypozyczenia
Set
Ilosc_dni=DateDiff("d",Data_wypozyczenia,Data_faktycznego_zwrotu)
0

Dałbyś radę pomóc mi jeszcze z jedną rzeczą? Mam problem z ADOQuery1.SQL.Text nie wiem jak napisać dobrą kwerendę.
Mam 3 tabele (wypozyczenia,samochod,cennik)

  • tabela wypozyczenia ma w sobie id samochod
  • tabela samochod ma id cennik
  • i chciałem odczytać np. z tabeli cennik pozycje z kolumny kwota do odpowiedniego id wypozyczenia
0

Joiny w accessie wymagają nawiasów, moę się pomylić, ale powinno być mniej więcej tak:

Select
    *
FROM
    ((wypozyczenia as w
     inner join samochod as s on s.id_samochod=w.id_samochod)
     inner join cennik as c on c.cennik_id=s.cennik_id)

Jak masz access'a to wyklikaj sobie te joiny w kreatorze...

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