Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [mysql] zapytanie do bazy danych
Forum PHP.pl > Forum > Bazy danych
AndyPSV
Witam,
chcialbym wybrac rekordy z bazy danych, ktore zostaly wprowadzone w 3 ostatnich dniach. Format pola `date`: dzien-miesiac-rok godziny:minuty.
Przedstawiam kod i prosze o jego poprawe/wytlumaczenie czemu to co napisalem nie dziala (chodzi o linijke po AND - zaznaczam, ze bez niej wszystko dziala prawidlowo).
  1. SELECT *                          
  2. FROM `<span
  3. style='color:red'>'.PREFIX.'news`
  4. WHERE `accepted` = 1 AND (`date` BETWEEN SUBDATE(DATE_FORMAT(NOW(), "%d-%m-%Y %h:%i"), INTERVAL 3 DAY) AND DATE_FORMAT(NOW(), "%d-%m-%Y %h:%i"))
  5. ORDER BY `id` DESC LIMIT 0, '.NEWS_ON_PAGE.'


Pozdrawiam !

Edit. Sor za bledy, poprawione.
mike
1. Zły bbCode. Do zapytań używamy [ sql ] a nie [ php ] Proszę poprawić.
2. Jaki to ma związek z php? Przenoszę na Bazy danych
SongoQ
Powinno byc

  1. ....... NOW() - INTERVAL ... AND NOW() .............
AndyPSV
Nie dziala - wyskakuje, ze jest 0 newsow. NOW(), jesli dobrze sie orientuje nie dopasowywuje sie do dowolnego formatu.

Ma ktos jakis pomysl ?
SongoQ
Bo pewnie masz inny typ. Pokaz strukture.
AndyPSV
Pole `date` mam typu varchar(255).
Co w takim razie musze zrobic, aby zachowac format daty ?
Kinool
uzyc pola ktore jest stwozone do przechowywania czasu smile.gif np DATE, DATETIME, YEAR itp zalezy co chesz przechowywac smile.gif jesli sama date to DATE
AndyPSV
Wracajac do problemu - mam pole typu varchar(255) i chce koniecznie zachowac format: dzien-miesiac-rok godziny:minuty. W polach typu TIMEDATE format jest przestawiony. Chce wyswietlic newsy dodane w czasie 3 ostatnich dni.
Jak to zrobic bez zmiany formatu, aby dzialalo. Prosze o pomoc !
dr_bonzo
Przeciez mozesz zmienic format wyswietlania daty i skonwertowac format daty wprowadzanej do aplikacji do formatu bazy danych. Duzo latwiej jest operowac w bazie na datach przechowywanych w odpowiednich dla nich typach.
spenalzo
A ja sugeruje przechowywać date jako liczbe - zapisywać czas w formacie unixowym. Jest to dla mnie najwygodniejsze rozwiązanie, gdyż wszystkie operacje na dacie to są zwykle działania matematyczne.
Potrzebujesz odjąć 1h i 5 min od daty w bazie? Nie ma sprawy: "data - 3900" i załatwione.
Plusem tego rozwiązania jest to, że możesz sobie dowolnie formatować wynik przy użyciu funkcji php albo MySQL.
SongoQ
Cytat
A ja sugeruje przechowywać date jako liczbe - zapisywać czas w formacie unixowym.

A slyszales o czyms takim jak timestamp?questionmark.gif Radze zajrzec do manuala. Odnosnie prezentacji przy wyciaganiu danych jest w MySQL bardzo wiele funkcji. Nie ma sensu na nowo odkrywac ameryke. Po to takie pola sa zeby z nich korzystac a nie wymyslac rzeczy - raz nie optymalne a 2 ktore sie beznadziejnie uzywa.
spenalzo
Czasami nad wydajność stawiam wygode korzystania z danych rozwiązań. Dla mnie jest najwygodniejsze korzystanie z tego co opisalem - i nie spodziewam sie że jest to niewydajne.
SongoQ
Cytat
Czasami nad wydajność stawiam wygode korzystania z danych rozwiązań. Dla mnie jest najwygodniejsze korzystanie z tego co opisalem - i nie spodziewam sie że jest to niewydajne.


Ta, oczywiscie i nie przejmujesz sie ze zapytanie trwa np 10 s?. Jesli jest typ do tego stworzony i dodatkowo sa dostepne funkcje do daty, czasow, itervalow czasowych i inne rzeczy ktore operuja na dacie to dla Ciebie to bez roznicy?
spenalzo
Cytat
Ta, oczywiscie i nie przejmujesz sie ze zapytanie trwa np 10 s?. Jesli jest typ do tego stworzony i dodatkowo sa dostepne funkcje do daty, czasow, itervalow czasowych i inne rzeczy ktore operuja na dacie to dla Ciebie to bez roznicy?

No faktycznie. Dodawanie/odejmowanie dwóch liczb trwa 10 sekund ohmy.gif

A co do drugiej części: tak, jeżeli wygodniej korzystać mi z rozwiązania jakie podalem wyzej. Naprawde nie wmowisz mi, że odjęcie od jednego pola liczby np. 3600 razy dziesięć tysiecy rekordów jest wolniejsze od wykonania czegoś takiego jak w 1szym poście tutaj.
AndyPSV
OK, juz zrozumialem - wstawie date tak jak trzeba, nastepnie po jej pobraniu ja odpowiednio zmodyfikuje. Dzieki chlopaki !

P.S. Przydatne okazaly sie linki:
http://dev.mysql.com/doc/refman/4.1/en/dat...-functions.html
http://dev.mysql.com/doc/refman/4.1/en/string-functions.html
SongoQ
OK, jesli to taka wygoda dla Ciebie to napisz mi takiego selecta.

Zwroc daty wieksza o 1 miesiac dla dat, ktore mamy w bazie danych.

przykladowe rekordy:
jakis tam rok przestepny 20 luty
jakis tam sobie rok 20 luty

wynik:
... 20 marzec
... 20 marzec

Oczywiscie wygoda wedlug Ciebie?
spenalzo
Nie wiem co starasz sie udowodnić...

Owszem w takim wypadku jest to mniej wygodne, ale w 99% przypadkach nadal zostane przy swoim rozwiązaniu , do czasu kiedy nie napotkam na ten 1%. Przez ten czas który sie zajmuje tworzeniem skryptów jeszcze się na to nie natknąlem.

A o moją wiedzę na temat funkcji dotyczących daty i czasu w mysqlu sie nie bój.
SongoQ
Cytat
Nie wiem co starasz sie udowodnić...

Staram udowodnic Ci to ze po to sa pola do operacji czasowych jak i funkcje przeznaczone.

Cytat
Owszem w takim wypadku jest to mniej wygodne, ale w 99% przypadkach nadal zostane przy swoim rozwiązaniu

Co jest mniej wydajne? Przeciez nic nie napisales, podalem przyklad i myslalem ze podasz mi jakies przyklady - brak argumentow.

Cytat
Przez ten czas który sie zajmuje tworzeniem skryptów jeszcze się na to nie natknąlem.

Heheheh dobre - dla Ciebie lata przestepne i obliczanie tego to 1%? Przeciez to jest powazny problem, no nic przeciez to tylko 1%.

Cytat
A o moją wiedzę na temat funkcji dotyczących daty i czasu w mysqlu sie nie bój.

Wcale sie nie boje. Zapytalem - niestety nie uzyskalem przykladu ktory by to uwzglednil.

Odpowiedz na pytanie jest prosta. Wykorzustujac int jako przechowywanie sekund jest niepoprawne, na tej podstawie nie mozesz operacji robic na datach przynajmniej takiej jaka ja podalem. W takim przypadku musisz np warunkami i podselectem wyliczac lata przestepne i dodawac odpowiednia liczbe do wartosci int.

Dla daty typu timestamp jest to zaledwie wpisanie
  1. + INTERVAL 1 ...
miesiac, dzien, rok, itd
To jest mechanizm wewnetrzny bardzo dobrze dopracowany przez autorow baz danych, nie trzeba zadnych wymyslnych rzeczy jak w Twoim przypadku wprowadzac.

Zwrocilem Ci uwage, ze to nie jest dobry sposob, moge Ci jeszcze wiele przykladow podac, no ale jesli sie uperasz dalej to mozemy dyskusje dalej toczyc, moze osoby przegladajace forum cos wyniosa z tego.

Chciales zaawansowanych rzeczy w MySQL (ostatni post na ktory razem sie wypowadalismy) to teraz slucham (chociaz to jest najprosztrze rzecz bazodanowa zwiazana z data).
spenalzo
W 99% przypadkach z jakimi mialem do czynenia wystarczające bylo uzycie liczby do opisu daty.

Najprostszy przyklad:
mam sobie koszyk produktów w sklepie internetowym, no i jak wiadomo, co jakiś czas trzeba go czyścic. Dla mnie najprostszym sposobem jest wykonanie czegoś takiego:
  1. <?php
  2. $czas=time()-7200; // 2 godziny
  3. mysql_query("DELETE FROM koszy WHERE czas < ".$czas);
  4. ?>

i sądzę ze jest to wydajniejsze niż użycie funkcji związanych z datą i czasem.

Nie mówie oczywiście, że NIE MA zastosować gdzie takie coś sie nie sprawdzi.


Cytat
Wykorzustujac int jako przechowywanie sekund jest niepoprawne

Ja bym tego tak nie nazwał tongue.gif Jak już to "czasami nieefektywne" winksmiley.jpg
SongoQ
Cytat
Nie mówie oczywiście, że NIE MA zastosować gdzie takie coś sie nie sprawdzi.

A jesli przyjdzie Ci cos zrobic gdzie nie masz wyjscia i musisz uzyc operacji na datach to co wtedy przerabiasz baze? Zamast jakiejs daty masz usunac koszyk o dokladnie miesiac i tu zaczyna sie problem. Z doswiadczenia wiem ze jesli jakis typ jest stworzony do czegos to tak sie definiuje. To nie jest moj jakis tam wymysl, to sa mechanizmy i teoria opracowana przez duza liczbe ludzi gdzie sie sprawdza w kazdej bazie danych.
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.