Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> problem z porównywaniem wyrażeń
morris4life
post
Post #1





Grupa: Zarejestrowani
Postów: 17
Pomógł: 0
Dołączył: 31.05.2008

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


jak napisać wyrażenie SQL które wyszuka wartość najbardziej odpowiadającą wzrocowi.
dokładnie chodzi o porównywanie dat.

przykład:
w tabeli są wiersze z datami 2008-05-01, 2008-05-04. Wzorzec to 2008-05-02. Zapytanie ma zwrócić datę najbliższą, czyli 2008-05-01

z góry dziękuję za pomoc....wszelkie podpowiedzi, linki, lub rozwiązania mile widziane (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)

Sprawa PILNA na wczoraj (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 13)
cojack
post
Post #2





Grupa: Zarejestrowani
Postów: 898
Pomógł: 80
Dołączył: 31.05.2008

Ostrzeżenie: (20%)
X----


Ja bym to zrobiłtak:

  1. SELECT DATA FROM nazwa_tabeli WHERE DATA LIKE '2008-05-" limit wartosc;
Go to the top of the page
+Quote Post
morris4life
post
Post #3





Grupa: Zarejestrowani
Postów: 17
Pomógł: 0
Dołączył: 31.05.2008

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


no tak tylko że to wyrażenie zwróci daty z maja 2008 a mi chodzi o tylko jedną konkretną datę/dzień :]
Go to the top of the page
+Quote Post
cojack
post
Post #4





Grupa: Zarejestrowani
Postów: 898
Pomógł: 80
Dołączył: 31.05.2008

Ostrzeżenie: (20%)
X----


a jaki typ ma rekord data?
DATETIME czy TMESTAMP?

Ten post edytował cojack 31.05.2008, 15:42:33
Go to the top of the page
+Quote Post
morris4life
post
Post #5





Grupa: Zarejestrowani
Postów: 17
Pomógł: 0
Dołączył: 31.05.2008

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


typ DATE , to jest baz MySQL
Go to the top of the page
+Quote Post
cojack
post
Post #6





Grupa: Zarejestrowani
Postów: 898
Pomógł: 80
Dołączył: 31.05.2008

Ostrzeżenie: (20%)
X----


  1. SELECT DATE('2008-05-02', - INTERVAL 1 DAY);


nie testowane.


  1. SELECT * FROM nazwa_tablicy WHERE date < '2008-05-02' LIMIT 1 ;


działa na bank.

Ten post edytował cojack 31.05.2008, 17:02:49
Go to the top of the page
+Quote Post
morris4life
post
Post #7





Grupa: Zarejestrowani
Postów: 17
Pomógł: 0
Dołączył: 31.05.2008

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


Cytat(cojack @ 31.05.2008, 17:50:43 ) *
  1. SELECT DATE('2008-05-02', - INTERVAL 1 DAY);


nie testowane.


  1. SELECT * FROM nazwa_tablicy WHERE date < '2008-05-02' LIMIT 1 ;


działa na bank.



no tak tyle że jak będą 2 daty w tabeli, pierwsza to 2008-04-30 a druga to 2008-05-03, to wynik tego zapytania zwróci mi tylko 2008-04-30 a wynik ma właśnie być 2008-05-03, czyli ta bliższa data (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

dziekuję za aktywność, i nadal potrzebuje pomocy
Go to the top of the page
+Quote Post
cojack
post
Post #8





Grupa: Zarejestrowani
Postów: 898
Pomógł: 80
Dołączył: 31.05.2008

Ostrzeżenie: (20%)
X----


  1. SELECT DATA FROM nazwa_tabeli WHERE DATA BETWEEN '2008-04-30' AND '2008-05-03' ORDER BY DATA DESC LIMIT 1 ;


lub

  1. SELECT DATA FROM nazwa_tablicy WHERE DATA < '2008-05-03' ORDER BY DATA DESC LIMIT 1 ;


musi któreś działać...

  1. SELECT DATA FROM nazwa_tablicy WHERE DATA = (SELECT (max(DATA)-1) FROM nazwa_tablicy);


ta ostatnia to jest z poprawką z @irc.pl #php.pl

Ten post edytował cojack 31.05.2008, 18:39:14
Go to the top of the page
+Quote Post
morris4life
post
Post #9





Grupa: Zarejestrowani
Postów: 17
Pomógł: 0
Dołączył: 31.05.2008

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


Cytat(cojack @ 31.05.2008, 19:08:27 ) *
  1. SELECT * FROM nazwa_tabeli WHERE DATA BETWEEN '2008-04-30' AND '2008-05-03' ORDER BY date DESC LIMIT 1 ;



ok spróbuję , ale co oznacza ta komenda desc? (IMG:http://forum.php.pl/style_emoticons/default/questionmark.gif) ;o

ad poprzedniej odpowiedzi....pewnie działa (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) ale nadal nie wskazuje tej bliższej daty do wzorca...a wzorzec będzie dynamicznie zmieniany.
polecenie musi chyba wyliczać czy mniej dni jest od wzorca do późniejszej daty czy do wcześniejszej daty

Cytat(cojack @ 31.05.2008, 19:08:27 ) *
  1. SELECT * FROM nazwa_tabeli WHERE DATA BETWEEN '2008-04-30' AND '2008-05-03' ORDER BY date DESC LIMIT 1 ;

....
nawet tutaj polecenie nie wie czy wzorzec, załóżmy 2008-05-01 jest bliższy 2008-04-30 czy 2008-05-03...ot cały szkopół (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)

i jeszcze jeden problem dlaczego mają w tabeli wiersze 2008-05-22 i 2008-05-31, wykonując składnię:
CODE
Select * FROM tabela WHERE data > 2008-05-21 LIMIT 1

zwraca ona datę nie 2008-05-22 tylko 2008-05-31? nie kumam tego, jakby nie widział tego wiersza

ok apropos tego nie widzenia dat 2008-05-22 to była wina tego że wyników nie posortowałem według kolumny "data" :/ (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

Ten post edytował morris4life 31.05.2008, 18:29:43
Go to the top of the page
+Quote Post
Kicok
post
Post #10





Grupa: Zarejestrowani
Postów: 1 033
Pomógł: 125
Dołączył: 17.09.2005
Skąd: Żywiec

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


  1. SELECT *
  2. FROM `tabela` ORDER BY ABS( DATEDIFF( '2008-05-02', `data` ) ) ASC LIMIT 1
Go to the top of the page
+Quote Post
cojack
post
Post #11





Grupa: Zarejestrowani
Postów: 898
Pomógł: 80
Dołączył: 31.05.2008

Ostrzeżenie: (20%)
X----


Kicok ale jeżeli on za date poda dzień np: 2008-05-02 to wynik mu zwróci 0, a jak poda wynik np: 2008-04-28 to wynik zwróci mu 6, bo DATEDIFF zwraca różnice, tyle... jakoś nie rozumiem Twojego toku rozumowania, możesz wyjaśnić?

Ten post edytował cojack 31.05.2008, 19:21:18
Go to the top of the page
+Quote Post
Wodzu
post
Post #12





Grupa: Zarejestrowani
Postów: 13
Pomógł: 2
Dołączył: 17.09.2005

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


A może tak:
  1. SELECT * FROM tabela WHERE DATA!='$data_bazowa' AND ABS(DATEDIFF(DATA,'$data_bazowa'))=MIN(ABS(DATEDIFF(DATA,'$data_bazowa')))

lub tak:
  1. SELECT * FROM tabela WHERE DATA!='$data_bazowa' ORDER BY ABS(DATEDIFF(DATA,'$data_bazowa')) LIMIT 1

Improwizuję, nie sprawdzałem (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Polecam funkcje daty i czasu w MySQL

Pozdr.
Wodzu

Ten post edytował Wodzu 31.05.2008, 19:27:37
Go to the top of the page
+Quote Post
Kicok
post
Post #13





Grupa: Zarejestrowani
Postów: 1 033
Pomógł: 125
Dołączył: 17.09.2005
Skąd: Żywiec

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


Cytat
Kicok ale jeżeli on za date poda dzień np: 2008-05-02 to wynik mu zwróci 0, a jak poda wynik np: 2008-04-28 to wynik zwróci mu 6


`data` w moim zapytaniu oznacza kolumnę z datami, a nie "miejsce w którym należy wstawić swoją datę". Tego w ogóle nie powinno się ruszać.
Miejsce w zapytaniu w którym można podać swoją datę masz na czerwono - ja jako przykład podałem '2008-05-02'
Go to the top of the page
+Quote Post
morris4life
post
Post #14





Grupa: Zarejestrowani
Postów: 17
Pomógł: 0
Dołączył: 31.05.2008

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


a od której wersji MySQL działa funkcja DATEDIFF?(IMG:http://forum.php.pl/style_emoticons/default/questionmark.gif) bo ja mam 3.32 i chyba nie rozpoznaje jej :/
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 23.08.2025 - 19:32