[MySQL]wyszukiwanie DATY złożonej z oddzielnego DNIA, MIS. w zapytaniu SELECT, Złożenie daty w zapytaniu SELECT... |
[MySQL]wyszukiwanie DATY złożonej z oddzielnego DNIA, MIS. w zapytaniu SELECT, Złożenie daty w zapytaniu SELECT... |
8.11.2017, 17:46:40
Post
#1
|
|
Grupa: Zarejestrowani Postów: 44 Pomógł: 0 Dołączył: 12.03.2010 Ostrzeżenie: (0%) |
Dzień dobry.
Przeszukałem TO forum ale nie znalazłem odpowiedzi... W bazie danych MySQL mam kolumny "dzien" , "miesac" i "rok" (taką mam konieczność dla innych potrzeb). Muszę wyselekcjonować dane dane nie starsze niż 21 dni od ROCZNICY danego pana. Dlatego staram się w zapytani SELECT z istniejących danych stworzyć datę "oszukaną" z wstawionym bieżącym rokiem, i porównać ją z dzisiejszą ustawiając warunek różnicy 21 dni. Próbowałem przeróżne przekształcenia i za każdym razem jest źle. załóżmy że baza wygląda podobnie: id imie nazwisko funkcja rok miesiac dzien rola uwagi 1 Jan Pierwszy RR 1967 12 03 AA brak 2 Piotr Drugi KD 1986 01 22 FT brak 3 Olaf Trzeci JY 2001 11 15 KF brak Próbowałem na prostych i poprawnych - nie działało. Próbowałem innych przeróżnych i dziwnych kombinacji i nic... Zrobiłem nawet tak dziwaczne pytanie : $wynik = mysql_query ("SELECT * FROM baaazzza WHERE DATEDIFF( ('2017-miesiac-dzien'), '2017-11-08') < 21 ;") or die ("błąd w pytaniu"); i też nic Chyba się zapędziłem w ZŁE myślenie. |
|
|
8.11.2017, 18:00:17
Post
#2
|
|
Grupa: Zarejestrowani Postów: 6 761 Pomógł: 1822 Dołączył: 11.03.2014 Ostrzeżenie: (0%) |
-------------------- |
|
|
8.11.2017, 18:29:56
Post
#3
|
|
Grupa: Zarejestrowani Postów: 44 Pomógł: 0 Dołączył: 12.03.2010 Ostrzeżenie: (0%) |
niestety nie odejmuje --- błąd zapytania SELECT... To połączenie chyba nie do SELECT'u.
|
|
|
8.11.2017, 18:38:42
Post
#4
|
|
Grupa: Zarejestrowani Postów: 6 761 Pomógł: 1822 Dołączył: 11.03.2014 Ostrzeżenie: (0%) |
Jeśli błąd zapytania, to na pewno nie odejmuje.
Pokaż zapytanie. -------------------- |
|
|
8.11.2017, 19:09:31
Post
#5
|
|
Grupa: Zarejestrowani Postów: 44 Pomógł: 0 Dołączył: 12.03.2010 Ostrzeżenie: (0%) |
popełniłem literówkę i dlatego był błąd. Teraz nie pokazuje żadnego komunikatu i nie zatrzymuję się tutaj, wykonuje dalszą część strony bez błędu. Tak to wygląda (wersja pierwsza):
$wynik = mysql_query ("SELECT * FROM baaazzza WHERE DATEDIFF(CONCAT('2017','miesiac','dzien'), '2017-11-08') < 21 ;") or die ("błąd w pytaniu"); sprawdziłem też "dziwactwa" ale też żadnej reakcji $wynik = mysql_query ("SELECT * FROM baaazzza WHERE DATEDIFF(CONCAT(2017,miesiac,dzien), '2017-11-08') < 21 ;") or die ("błąd w pytaniu"); $wynik = mysql_query ("SELECT * FROM baaazzza WHERE DATEDIFF(CONCAT(2017, miesiac, dzien), '2017-11-08') < 21 ;") or die ("błąd w pytaniu"); przy próbach bez " DATEDIFF " rezultat identyczny - die ("błąd w pytaniu")... przy próbach z zastosowanie przekształcenia przez " DATE_FORMAT " również nic.. eksperymentując zrobiłem: $wynik = mysql_query ("SELECT * FROM baaazzza WHERE ('2017-01-08' - rok-miesiac-dzien) > 21 ;") or die ("błąd w pytaniu"); wyszukuje mi ale błędne wyniki, zupełnie nie wiem jaką zasadą się kieruje. Najpierw myślałem, że bierze tylko pierwszą wartość czyli "rok" - ale nie, doszedłem do wniosku, że odejmuje wszystkie wartości od siebie ale też chyba nie bo z czym by porównywał. Jeżeli zamiast wartości 21 wiszę 1997 to przestaje szukać... Zagubiłem się |
|
|
8.11.2017, 19:19:38
Post
#6
|
|
Grupa: Zarejestrowani Postów: 6 761 Pomógł: 1822 Dołączył: 11.03.2014 Ostrzeżenie: (0%) |
A sprawdzałeś jaki format daty otrzymujesz przy takim użyciu CONCAT?
-------------------- |
|
|
8.11.2017, 23:10:15
Post
#7
|
|
Grupa: Zarejestrowani Postów: 44 Pomógł: 0 Dołączył: 12.03.2010 Ostrzeżenie: (0%) |
... to musi mieć jakieś proste rozwiązanie.. ale nie potrafię dalej połączyć trzech wartości (rok miesiac dzien) w wartość daty -- oczywiście w samym SELECT . Jak jest wsadzone w jakikolwiek nawias (nawet sama poprawna data np. DAYOFYEAR('data') -- to pokazuje błąd. Co prawda sprawdzam to na VertrigoServ chyba z 2014 albo 2015roku ?
Nie wyszukuje nic nawet jak zastosuje "AS"... Konic końców będę chyba musiał połączyć w samej bazie danych i z tego korzystać --- ale może jednak dostanę jakąś podpowiedź... |
|
|
9.11.2017, 08:33:56
Post
#8
|
|
Grupa: Zarejestrowani Postów: 6 761 Pomógł: 1822 Dołączył: 11.03.2014 Ostrzeżenie: (0%) |
Dałem Ci podpowiedź.
Zobacz co uzyskujesz łącząc w swój sposób: CONCAT('2017',miesiac,dzien). Przenieś ten CONCAT do listy kolumn w SELECT zamiast w WHERE (zwykłe zapytanie SELECT bez WHERE) i sprawdź jaki uzyskujesz format daty. -------------------- |
|
|
9.11.2017, 09:45:09
Post
#9
|
|
Grupa: Zarejestrowani Postów: 1 421 Pomógł: 310 Dołączył: 18.04.2012 Ostrzeżenie: (0%) |
SELECT * FROM baaazzza WHERE DATEDIFF( '2017-11-08', STR_TO_DATE(CONCAT('2017',miesiac,dzien),'%Y%m%d')) < 21
|
|
|
9.11.2017, 11:12:06
Post
#10
|
|
Grupa: Zarejestrowani Postów: 44 Pomógł: 0 Dołączył: 12.03.2010 Ostrzeżenie: (0%) |
...wygląda to tak (jest lepiej ale nie do końca):
$wynik = mysql_query ("SELECT CONCAT('rok',':',miesiac,':',dzien) FROM baaazzza ;") or die ("błąd w pytaniu"); daje w wyniku np. 1986:07:02 jak nie dam dwukropków to bez nich, ciągiem: 19860702. Jak zamiast roku dam '2017' to: z 2017 na początku $d1=date("Y-m-d"); // bieżąca data. $wynik = mysql_query ("SELECT *, CONCAT('rok',':',miesiac,':',dzien) AS trele FROM baaazzza WHERE '$d1' < 'trele' ;") or die ("błąd w pytaniu"); to znajduje mi chyba wszystkie dane (czyli 100% linii) a wszystkie daty złożone, są MNIEJSZE od dnia dzisiejszego...? są tam lata 1978, 1982 itp. --- czyli czyta jakoś dziwnie. Jeżeli odwrócę znak w przeciwną stronę ">" nie znajduje nic. Próbowałem dodawać abstrakcyjnie wielkie wartości (np. 1000000) ale jak nie znajduje to nie znajduje. jeżeli "trele" zrobię tak: '$d1' > date('trele') --- to nie pokazuje błędu ale nic nie znajduje. -------------- dalsze eksperymenty z KOLEJNY DZIEŃ ROKU: "trele" w DAYOFYEAR(date(trele)) ::: ... WHERE DAYOFYEAR('$d1')-2 < DAYOFYEAR(date(trele)) ---- pokazuje błąd w zapytaniu ... WHERE DAYOFYEAR('$d1') > DAYOFYEAR(date('trele')) ----- również "<" nic nie znajduje ... WHERE DAYOFYEAR('$d1') > DAYOFYEAR(date(trele)) ----- bez apostrofów - oczywiście pokazuje błąd zapytania ... WHERE DAYOFYEAR('$d1') > DAYOFYEAR('trele') ----- również "<" nic nie znajduje zapewne to moje "trele" nie jest widziane jako data. ? |
|
|
9.11.2017, 12:12:05
Post
#11
|
|
Grupa: Zarejestrowani Postów: 1 421 Pomógł: 310 Dołączył: 18.04.2012 Ostrzeżenie: (0%) |
widzisz różnicę między 'trele' a `trele`? (i czy wiesz jaka to różnica)
Czemu nie uzyjesz STR_TO_DATE, którą napisałem powyżej? |
|
|
9.11.2017, 13:57:33
Post
#12
|
|
Grupa: Zarejestrowani Postów: 44 Pomógł: 0 Dołączył: 12.03.2010 Ostrzeżenie: (0%) |
czemu piszesz o "odwróconym apostrofie" nigdzie go tu nie używałem
---- ale dzięki - zastosowanie: ... STR_TO_DATE(CONCAT('2017', ... działa we wszystkich, do tej pory problemowych, próbowanych poleceniach. Jest OK. Dzięki serdeczne za skuteczną pomoc. Tak na marginesie - polecenia " DATEDIFF " w ogóle nie znałem - raz jeszcze dzięki. |
|
|
9.11.2017, 22:24:23
Post
#13
|
|
Grupa: Zarejestrowani Postów: 1 421 Pomógł: 310 Dołączył: 18.04.2012 Ostrzeżenie: (0%) |
|
|
|
Wersja Lo-Fi | Aktualny czas: 28.04.2024 - 03:50 |