Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]BETWEEN DATA i TIME - zapytanie mysql
Forum PHP.pl > Forum > Przedszkole
casperii
Panowie próbuje pobrać rekordy w sposób:

  1. ... WHERE (date between (date('Y-m-d') - INTERVAL 4 DAYS) AND date('Y-m-d')) AND (time between (date('G:i:s') - INTERVAL 1 MINUTE) AND date('G:i:s' + INTERVAL 1 MINUTE))


Zamierzony cel, wyświetl wyniki z zakresu 4 dni wstecz do teraz i z godziny minute przed i po zgodnie z aktualnym czasem.
Teraz wygląda to tak, że pokazuje mi 18-go wszystkie, ale 17go- pokazuje tylko 1 rekord.
Co jest tu źle ?
trueblue
date('Y-m-d') lub date('G:i:s') to jest użycie funkcji MySQL? Nie ma takiej funkcji, jest DATE_FORMAT, ale jeśli chcesz wyłuskać samą datę to wystarczy DATE(), sam czas TIME().
time to pole tabeli?
casperii
date , time to pola w bazie.

  1. (time between (DATE_FORMAT(TIME, '10:50:00')) AND DATE_FORMAT(TIME, '21:01:00'))


powyższe działa, jak do tego wpiąć INTERVAL 5 MINUTE ? bo nijak mi nie wychodzi:


  1. (time between (DATE_FORMAT(TIME, '%H:%i:%s') - INTERVAL 5 MINUTE) AND DATE_FORMAT(TIME, '%H:%i:%s'))

trueblue
Nie ma to większego sensu.

Jakiego typu są te dwa pola (date, time)?
Nie możesz przechowywać ich razem w polu typu DATETIME?
casperii
Niestety nie może być typu DATETIME ,ponieważ później mam warunki rozbite w zależności od daty i czasu.
Pole date jest typu date, pole time jest typu time
Dlaczego twoim zdaniem to nie ma sensu ?
trueblue
Dlatego, że w pierwszym przykładzie do DATE_FORMAT powinien być przekazany format czasu.
W drugim przypadku to robisz, ale po co, skoro pole czas przechowuje właśnie czas.

Czy na pewno chcesz każdy dzień z zakresu ograniczyć od wybranego zakresu czasu, czy tylko pierwszy i ostatni dzień?

Pokaż przykładową datę i czas.
casperii
Zapytanie ma wyglądać tak, że pobiera mi rekordy z zakresu dat 4 dni od dzisiejszej daty do daty wczorajszej z godziny np. z zakresu 1h wcześniej niż obecna godzina do godziny 5 minut temu. Myślę , że zrozumiałeś:

date (date) = 2017-01-15 || time (time) = 20:00:03
date (date) = 2017-01-16 || time (time) = 21:00:03
date (date) = 2017-01-17 || time (time) = 21:02:05
date (date) = 2017-01-17 || time (time) = 22:07:05
date (date) = 2017-01-18 || time (time) = 23:01:03

Czyli o godz. 21:57 w dn 19-01-2017 , powinno mi pokazać rekordy:
date (date) = 2017-01-16 || time (time) = 21:00:03
date (date) = 2017-01-17 || time (time) = 21:02:05
trueblue
Sprawdź:
  1. `date`>=DATE_SUB(CURDATE(),INTERVAL 4 DAY) AND `date`<=DATE_SUB(CURDATE(),INTERVAL 1 DAY)
  2. AND
  3. `time`>=TIME(DATE_SUB(NOW(),INTERVAL 1 HOUR) AND `time`<=TIME(DATE_SUB(NOW(),INTERVAL 5 MINUTE))


P.S. Data i czas nie muszą być rozbite na dwie kolumny, aby ich używać w warunkach.
casperii
Dla pola date jest ok, ale dla pola time pokazuje mi wszystkie godziny:

  1. AND `time`>=TIME(DATE_SUB(NOW(),INTERVAL 59 MINUTE) AND `time`<=TIME(DATE_SUB(NOW(),INTERVAL 1 MINUTE)))


A powinno brać tylko z zakresu obecna godzina minus 59 minut do obecna godzina minus 1 minuta.
trueblue
Nawiasy.
  1. `time`>=TIME(DATE_SUB(NOW(),INTERVAL 1 HOUR)) AND `time`<=TIME(DATE_SUB(NOW(),INTERVAL 5 MINUTE))
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.