Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MYSQL]Zapytanie SELECT i opcja BETWEEN
Forum PHP.pl > Forum > Przedszkole
TheaSiX
Wprawdzie rozwiązałem już problem, o których chciałem wcześniej pisać (innym sposobem), to nadal mam niejasną sprawę do jednej rzeczy:

Staram się tworzyć coraz bardziej skomplikowane zapytanie do mojej bazy danych, aby się podszkolić i zyskać na czasie etc.

Chciałem sprawdzić dwa pola w jednej tabeli. Są to daty, ale (mój błąd - wiem) pola te są varchar a nie date, datetime czy timestamp. Mimo to chciałem wyświetlić wszystkie rekordy, które mieszczą się w danym przedziale czasowym. Na początku myślałem, że z powodu typu pola w tabeli coś może nie działać, ale poniższe zapytanie przyniosło oczekiwane rezultaty:

  1. <?php
  2. $sql = "SELECT id, purchase_date FROM products WHERE purchase_date BETWEEN '01.04.2009' AND '16.04.2009'";
  3. ?>


Jednak przez dwie godziny nie mogłem pojąć dlaczego nie działa zapytanie następujące:

  1. <?php
  2. $date_a = "01.04.2009";
  3. $date_b = "16.04.2009";
  4.  
  5. $sql = "SELECT id, purchase_date FROM products WHERE purchase_date BETWEEN '$date_a' AND '$date_b'";
  6. ?>


Powyższe zapytanie spowoduje wyświetlenie wszystkich rekordów tak jakby nie było w ogóle konstrukcji WHERE...

Próbowałem różnych sposobów(konwersja typu zmiennych, cudzysłowa zamiast apostrofów). Jednak nie znalazłem żadnego rozwiązania. Byłbym wdzięczny gdyby ktoś rozjaśnił mi sytuację smile.gif
guilty82
u mnie wyswietla prawidlowo, dziwne..
TheaSiX
Rozwinę swój przykład. Mam listę z której można wybrać dany miesiąc. Później metodą POST przesyłam to do kodu, który ma za zadanie wyciągnąć dane tylko z tego miesiąca. Oto schemat w jaki buduję zapytanie:

  1. <?php
  2. $month = $_POST["month"] //powiedzmy, że przesyłam maj czyli $month = 05
  3.  
  4. $first = "01.";
  5. $last = "31.";
  6. $year = ".2009";
  7.  
  8. $date_a = $first.$month.$year; //01.05.2009
  9. $date_b = $last.$month.$year; //31.05.2009
  10.  
  11. $sql = "SELECT id, purchase_date FROM products WHERE purchase_date BETWEEN '$date_a' AND '$date_b'";
  12. ?>


Proszę o nie komentowanie samego sposobu. Wiem, że może wydawać się on dziwny i bardzo lamerski. Zmieniłem już wszystko, ale nadal chciałbym znaleźć wytłumaczenie dlaczego powyższy kod nie chce działać..
blooregard
Może dlatego, że Ty przesyłasz daty w postaci RRRR.MM.DD, a MySQL przechowuje je w postaci RRRR-MM-DD ? (pole DATETIME)
.

Albo dlatego:
Cytat
expr BETWEEN min AND max

If expr is greater than or equal to min and expr is less than or equal to max, BETWEEN returns 1, otherwise it returns 0. This is equivalent to the expression (min <= expr AND expr <= max) if all the arguments are of the same type. Otherwise type conversion takes place according to the rules described in Section 11.2.2, “Type Conversion in Expression Evaluation”, but applied to all the three arguments.
mysql> SELECT 1 BETWEEN 2 AND 3;
-> 0
mysql> SELECT 'b' BETWEEN 'a' AND 'c';
-> 1
mysql> SELECT 2 BETWEEN 2 AND '3';
-> 1
mysql> SELECT 2 BETWEEN 2 AND 'x-3';
-> 0

For best results when using BETWEEN with date or time values, you should use CAST() to explicitly convert the values to the desired data type. Examples: If you compare a DATETIME to two DATE values, convert the DATE values to DATETIME values. If you use a string constant such as '2001-1-1' in a comparison to a DATE, cast the string to a DATE.
- cytat z http://dev.mysql.com/doc/refman/5.1/en/com...perator_between
TheaSiX
tak tylko w mysqlu datę przechowuję w postaci varchar a nie datetime

i wszystkie daty w bazie są w postaci dd.mm.yyyy
blooregard
Hmm, naprawdę dziwne, bo u mnie też działa
A sprawdzałeś gołe zapytanie w bazie danych? (np. w phpMyAdminie)
Zwraca prawidłowo wyniki?
TheaSiX
@blooregard nawet ten drugi przykład u Ciebie działa? to naprawdę dziwne

@zelu zauważ , że stringi $first oraz $year zawierają już kropki..
zelu
@TheaSiX
Zauwazylem, dlatego usunalem posta winksmiley.jpg

A jaki blad zwraca Ci MySQL?
piotrooo89
a pytanie Ty pracujesz w MsSQL'u czy w MySQL'u? bo temat mówi co innego a wy rozmawiacie o czym innym.
TheaSiX
mój błąd - nie zauważyłem. Oczywiście mowa o MySQL

edit--

błędu nie zwraca, wypisuje tylko wszystkie rekordy tak jakby zapytanie wyglądało:
  1. <?php
  2. $sql =  "SELECT * FROM products";
  3. ?>
piotrooo89
a takie coś co Ci zwraca?

  1. <?php
  2. $month = $_POST["month"]; //powiedzmy, że przesyłam maj czyli $month = 05
  3.  
  4. $first = '01';
  5. $last = '31';
  6. $year = '2009';
  7.  
  8. $date_a = $first.'.'.$month.'.'.$year; //01.05.2009
  9. $date_b = $last.'.'.$month.'.'.$year; //31.05.2009
  10.  
  11. $sql = "SELECT id, purchase_date FROM products WHERE purchase_date BETWEEN '".$date_a."' AND '".$date_b."'";
  12. ?>


#EDIT
kropki mi się pozjadało.
TheaSiX
  1. Parse error: syntax error, unexpected T_CONSTANT_ENCAPSED_STRING ON line 9


edit--

gdy użyje takiego kodu:
  1. <?php
  2. $first = '01';
  3. $last = '31';
  4. $year = '2009';
  5. $month = '05';
  6.  
  7. $date_a = "$first.$month.$year"; //01.05.2009
  8. $date_b = "$last.$month.$year";
  9. ?>


otrzymuje komunikat:
  1. You have an error IN your SQL syntax; CHECK the manual that corresponds TO your MySQL server version FOR the RIGHT syntax TO USE near '.2009 AND 31.05.2009' at line 1
zelu
Daj sobie echo z zapytania i doprowadź je do formatu
  1. SELECT id, purchase_date FROM products WHERE purchase_date BETWEEN '01.04.2009' AND '16.04.2009'


Kombinuj z apostrofami i cudzysłowami, np

  1. <?php
  2. $first = '01';
  3. $last = '31';
  4. $year = '2009';
  5.  
  6. $date_a = $first.".".$month.".".$year;
  7. $date_b = $last.".".$month.".".$year; //31.05.2009
  8.  
  9. $sql = "SELECT id, purchase_date FROM products WHERE purchase_date BETWEEN '".$date_a."' AND '".$date_b."'";
  10. ?>
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.