Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: problem z porównywaniem wyrażeń
Forum PHP.pl > Forum > Bazy danych > MySQL
morris4life
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 winksmiley.jpg

Sprawa PILNA na wczoraj winksmiley.jpg
cojack
Ja bym to zrobiłtak:

  1. SELECT DATA FROM nazwa_tabeli WHERE DATA LIKE '2008-05-" limit wartosc;
morris4life
no tak tylko że to wyrażenie zwróci daty z maja 2008 a mi chodzi o tylko jedną konkretną datę/dzień :]
cojack
a jaki typ ma rekord data?
DATETIME czy TMESTAMP?
morris4life
typ DATE , to jest baz MySQL
cojack
  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.
morris4life
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 smile.gif

dziekuję za aktywność, i nadal potrzebuje pomocy
cojack
  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
morris4life
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? questionmark.gif ;o

ad poprzedniej odpowiedzi....pewnie działa 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ół 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" :/ smile.gif
Kicok
  1. SELECT *
  2. FROM `tabela` ORDER BY ABS( DATEDIFF( '2008-05-02', `data` ) ) ASC LIMIT 1
cojack
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ć?
Wodzu
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 smile.gif Polecam funkcje daty i czasu w MySQL

Pozdr.
Wodzu
Kicok
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'
morris4life
a od której wersji MySQL działa funkcja DATEDIFF?questionmark.gif bo ja mam 3.32 i chyba nie rozpoznaje jej :/
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-2024 Invision Power Services, Inc.