Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP][MYSQL]Zapytanie SELECT i opcja BETWEEN, działanie na zmiennych
TheaSiX
post 20.04.2009, 22:50:12
Post #1





Grupa: Zarejestrowani
Postów: 110
Pomógł: 10
Dołączył: 3.09.2006
Skąd: Bishop Auckland

Ostrzeżenie: (0%)
-----


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

Ten post edytował TheaSiX 21.04.2009, 21:17:18
Go to the top of the page
+Quote Post
guilty82
post 20.04.2009, 23:34:37
Post #2





Grupa: Zarejestrowani
Postów: 176
Pomógł: 31
Dołączył: 26.03.2007

Ostrzeżenie: (0%)
-----


u mnie wyswietla prawidlowo, dziwne..
Go to the top of the page
+Quote Post
TheaSiX
post 21.04.2009, 20:08:25
Post #3





Grupa: Zarejestrowani
Postów: 110
Pomógł: 10
Dołączył: 3.09.2006
Skąd: Bishop Auckland

Ostrzeżenie: (0%)
-----


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ć..

Ten post edytował TheaSiX 21.04.2009, 20:09:04
Go to the top of the page
+Quote Post
blooregard
post 21.04.2009, 20:13:41
Post #4


Newsman


Grupa: Moderatorzy
Postów: 2 033
Pomógł: 290
Dołączył: 21.12.2007
Skąd: Łódź




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


--------------------
Life's simple... You make choices and don't look back...
Go to the top of the page
+Quote Post
TheaSiX
post 21.04.2009, 20:45:10
Post #5





Grupa: Zarejestrowani
Postów: 110
Pomógł: 10
Dołączył: 3.09.2006
Skąd: Bishop Auckland

Ostrzeżenie: (0%)
-----


tak tylko w mysqlu datę przechowuję w postaci varchar a nie datetime

i wszystkie daty w bazie są w postaci dd.mm.yyyy

Ten post edytował TheaSiX 21.04.2009, 20:46:06
Go to the top of the page
+Quote Post
blooregard
post 21.04.2009, 20:53:20
Post #6


Newsman


Grupa: Moderatorzy
Postów: 2 033
Pomógł: 290
Dołączył: 21.12.2007
Skąd: Łódź




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?


--------------------
Life's simple... You make choices and don't look back...
Go to the top of the page
+Quote Post
TheaSiX
post 21.04.2009, 21:02:43
Post #7





Grupa: Zarejestrowani
Postów: 110
Pomógł: 10
Dołączył: 3.09.2006
Skąd: Bishop Auckland

Ostrzeżenie: (0%)
-----


@blooregard nawet ten drugi przykład u Ciebie działa? to naprawdę dziwne

@zelu zauważ , że stringi $first oraz $year zawierają już kropki..
Go to the top of the page
+Quote Post
zelu
post 21.04.2009, 21:06:17
Post #8





Grupa: Zarejestrowani
Postów: 229
Pomógł: 34
Dołączył: 7.12.2008
Skąd: Poznań

Ostrzeżenie: (0%)
-----


@TheaSiX
Zauwazylem, dlatego usunalem posta winksmiley.jpg

A jaki blad zwraca Ci MySQL?

Ten post edytował zelu 21.04.2009, 21:06:39
Go to the top of the page
+Quote Post
piotrooo89
post 21.04.2009, 21:09:17
Post #9


Newsman


Grupa: Moderatorzy
Postów: 4 005
Pomógł: 548
Dołączył: 7.04.2008
Skąd: Trzebinia/Kraków




a pytanie Ty pracujesz w MsSQL'u czy w MySQL'u? bo temat mówi co innego a wy rozmawiacie o czym innym.


--------------------
Go to the top of the page
+Quote Post
TheaSiX
post 21.04.2009, 21:17:42
Post #10





Grupa: Zarejestrowani
Postów: 110
Pomógł: 10
Dołączył: 3.09.2006
Skąd: Bishop Auckland

Ostrzeżenie: (0%)
-----


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. ?>


Ten post edytował TheaSiX 21.04.2009, 21:18:52
Go to the top of the page
+Quote Post
piotrooo89
post 21.04.2009, 21:32:02
Post #11


Newsman


Grupa: Moderatorzy
Postów: 4 005
Pomógł: 548
Dołączył: 7.04.2008
Skąd: Trzebinia/Kraków




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.

Ten post edytował piotrooo89 22.04.2009, 07:39:42


--------------------
Go to the top of the page
+Quote Post
TheaSiX
post 21.04.2009, 22:10:48
Post #12





Grupa: Zarejestrowani
Postów: 110
Pomógł: 10
Dołączył: 3.09.2006
Skąd: Bishop Auckland

Ostrzeżenie: (0%)
-----


  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


Ten post edytował TheaSiX 21.04.2009, 22:15:24
Go to the top of the page
+Quote Post
zelu
post 21.04.2009, 22:27:54
Post #13





Grupa: Zarejestrowani
Postów: 229
Pomógł: 34
Dołączył: 7.12.2008
Skąd: Poznań

Ostrzeżenie: (0%)
-----


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. ?>


Ten post edytował zelu 21.04.2009, 22:30:09
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 19.06.2025 - 00:59