Laravel porównywanie time

0
        if ($request->get("timeFrom") != "" and $request->get("timeTo") != "") {
            $this->question->whereRaw("time(date_start) <= " . "'" . $request->get("timeTo") . ":00'");
            $this->question->whereRaw("time(date_end) >= " . "'" .  $request->get("timeFrom") . ":00'");
        }
      else if ($request->get("timeTo") != "") {
            $this->question->whereRaw("time(date_end) <= " . "'" .  $request->get("timeTo") . ":00'");
        }
        else if ($request->get("timeFrom") != "") {
            $this->question->whereRaw("time(date_start) >= " . "'" .  $request->get("timeFrom") . ":00'");

Mam takie pytanie jak skonstruować takie zapytanie.

W tym przypadku jak się poda np czas timeFrom = 12:00 do 14:00 to wyskoczą mi wszystkie rekordy, które data startu jest większa bądź równa 12 i jednocześnie data końca mniejsza bądź równa 14:00, ale ja chciałbym mieć taką opcje, żeby np doba się zaczynała np od 3 lub 6 (mam tą opcje w innej tabeli ) i w tym przypadku, jak się poda date startu np. 23 a datę endu np 3 to żeby mi wyszukał wpisy między godziną 23 a 3.

3

Napisz warunek sprawdzający czy godzina "od" jest większa od godziny "do" i wtedy wykonaj odpowiednie zapytanie.

0

No właśnie a jak taki warunek powinien wyglądać ?

0
pol90 napisał(a):

No właśnie a jak taki warunek powinien wyglądać ?

Ty tak na serio?

Proszę bardzo:

if ($a < $b) {
    ...
}
0
serek napisał(a):
pol90 napisał(a):

No właśnie a jak taki warunek powinien wyglądać ?

Ty tak na serio?

Proszę bardzo:

if ($a < $b) {
    ...
}

Radze przeczytać mój pierwszy post ze zrozumieniem.

0

To są podstawy matematyki. Możesz np. coś takiego:

if (($a >= 23 && $a <=24) || ($a >= 0 && $a <= 3) {
 ....
}

To jest przykład, kod możesz sobie już dostosować.

0
serek napisał(a):

To są podstawy matematyki. Możesz np. coś takiego:

if (($a >= 23 && $a <=24) || ($a >= 0 && $a <= 3) {
 ....
}

To jest przykład, kod możesz sobie już dostosować.
Tak tylko, że ja myślałem bardziej nad jednym warunkiem bo tutaj nie wiesz jaka to będzie końcowa godzina może być 00 a może być 10 to wtedy początkowa też będzie 10

0
pol90 napisał(a):

Tak tylko, że ja myślałem bardziej nad jednym warunkiem bo tutaj nie wiesz jaka to będzie końcowa godzina może być 00 a może być 10 to wtedy początkowa też będzie 10

Nom, to sobie pod odpowiednie godziny podstawiasz inne i tyle. W czym więc problem? Zamiast godzin po prostu wstawiasz tam zmienną, w której będzie obliczana odpowiednia godzina.

0
serek napisał(a):
pol90 napisał(a):

Tak tylko, że ja myślałem bardziej nad jednym warunkiem bo tutaj nie wiesz jaka to będzie końcowa godzina może być 00 a może być 10 to wtedy początkowa też będzie 10

Nom, to sobie pod odpowiednie godziny podstawiasz inne i tyle. W czym więc problem? Zamiast godzin po prostu wstawiasz tam zmienną, w której będzie obliczana odpowiednia godzina.
Ale zobacz twoje zapytanie jak da się warunek, że wyciągnął z np. dnia 12.09.2020 - 12.09.2020

To w takim zapytanie jeżeli jest doba ustawiona od 5:00 - 5:00 to , żeby wyciągnął też z 13.09.2020 do 5:00

1

Moment, też się trochę pogubiłem chyba, bo to w sumie chcesz mieć jako zapytanie do bazy, a nie if. Sorki. Za ciepło jest, nie myślę już :P

Chodzi Ci o takie coś:

if ($od <= $do) {
    // tutaj zostawiasz zapytanie jakie masz
} elseif ($od > $do) {
 // tutaj zapytanie do bazy sprawdzające, czy godzina startu/końca jest 
 // - większa/równa od "od" i mniejsza/równa 24
 // - lub większa/równa 0 i mniejsza/równa od "do".
}
0
serek napisał(a):

Moment, też się trochę pogubiłem chyba, bo to w sumie chcesz mieć jako zapytanie do bazy, a nie if. Sorki. Za ciepło jest, nie myślę już :P

Chodzi Ci o takie coś:

if ($od <= $do) {
    // tutaj zostawiasz zapytanie jakie masz
} elseif ($od > $do) {
 // tutaj zapytanie do bazy sprawdzające, czy godzina startu/końca jest 
 // - większa/równa od "od" i mniejsza/równa 24
 // - lub większa/równa 0 i mniejsza/równa od "do".
}

Chodzi bardziej o coś takiego

(DATE(IF(HOUR(date_start) >= '$hour', date_start,Date_add(date_start, INTERVAL - 1 DAY) )) )

Tylko nie wiem jak tego użyć w kluzuli where ?

0

Kurcze, za każdym razem jak piszesz to piszesz nie jasną (przynajmniej dla mnie) ścianę tekstu. Potem ciężko to zrozumieć i wyciągnąć wnioski, a tym bardziej spróbować pomóc.
Jak na mój gust to mamy problem X/Y. Źle robisz.
Przebuduj front tak by zwracał właściwe dane do zapytania. Dlaczego tam nie dasz jakiejś możliwość typu wybór dnia do jeden wstecz i wyboru godziny?
Jak w Twojej sytuacji zwalidujesz czy użytkownik wybierając powiedzmy od 5 do 5 źle wybrał, czy miał na myśli zakres 24 godz?

0

No chodzi o to, że jak dam w zapytanie w selecie

(DATE(IF(HOUR(moods.date_start) >= '5', moods.date_start,Date_add(moods.date_start, INTERVAL - 1 DAY) )) ) 

To on uwzględni ta róńicę sekund i będzie wybierał tylko od 5 do 5
natomiast moje pytanie jest takie co trzeba zrobić, żeby uwzględnił ta różnicę sekund na podstawie tego co dałem w zapytanie sql i teraz wybrał od godziny np 23 do 3 ?

0

Pokaż to całe zapytanie, bo za cholerę nie wiem o co Ci chodzi.

Przecież to masz tylko zmianę wyświetlania daty. Nie ma to nic wspólnego z where.

0
$this->question->selectRaw("TIMESTAMPDIFF (SECOND, date_start , date_end) as longMood");
$this->question->groupBy(DB::Raw("(DATE(IF(HOUR(moods.date_start) >= '$hour', moods.date_start,Date_add(moods.date_start, INTERVAL - 1 DAY) )) ) "));

To ma bardziej z group

0

Już coś wymyśliłem bawiłem się konsolą mysql

i wymysliłem coś na bazie takiego zapytania.

select hour(date_start) -5,date_start  ,  case  when (hour(date_start) - 5) < 0 then 24 + hour(date_start) - 5 else hour(date_start) - 5 END as f      from moods  f  where (case  when (hour(date_start) - 5) <= 0 then 24 + hour(date_start) - 5 else hour(date_start) - 5 END  >= 19 - 5 and case  when (hour(date_start) - 5) < 0 then 24 + hour(date_start) - 5 else hour(date_start) - 5 END  < 24 - 5);

0
omenomn napisał(a):

użyj Carbona https://carbon.nesbot.com/docs/#api-comparison

To chyba nie rozwiąże mojego problemu, jednak anuluje mój poprzedni post.
Coś innego wykombinowałem,
I teraz w momencie kiedy data początkowej daty jest większa od końcowej to wtedy jest inne zapytanie.

if ($timeTo[0] <=  $hour and $timeTo[0] >= 0 and $timeFrom[0] > $timeTo[0]) {
                $this->question->whereRaw("(time(date_start) <= " . "'" . $request->get("timeTo") . ":00' 
or time(date_start) >= " . "'" .  "00:00" . ":00')");

                $this->question->whereRaw("(time(date_end) >= " . "'" .  $request->get("timeFrom") . ":00' 
or time(date_end) <= " . "'" .  $request->get("timeTo") . ":00') ");

                print "dd";
            }
            else {
                
                $this->question->whereRaw("(time(date_start) BETWEEN '" .  $request->get("timeFrom") . ":00' AND '" . 
$request->get("timeTo") . ":00' or (time(date_end))"

                        . " BETWEEN '" . $request->get("timeFrom") . ":00' AND '" . $request->get("timeTo") . ":00' 
or (time(date_start)) < '" . $request->get("timeFrom") . ":00'
 and (time(date_end)) > '" . $request->get("timeTo") . ":00')");

            }

I to zapytanie by generalnie załatwiło sprawę

 $this->question->whereRaw("(time(date_start) <= " . "'" . $request->get("timeTo") . ":00' 
or time(date_start) >= " . "'" .  "00:00" . ":00')");

                $this->question->whereRaw("(time(date_end) >= " . "'" .  $request->get("timeFrom") . ":00' 
or time(date_end) <= " . "'" .  $request->get("timeTo") . ":00') ");

Tylko, że jak damy przdział czasowy od 23:57 - 00:08 a nastrój będzie w przedziale czasowym 23:58 - 00:05 to wtedy nie wyszuka i teraz na to mam takie zapytanie.

$this->question->whereRaw("((time(date_start) BETWEEN '" .  $request->get("timeFrom") . ":00' AND '" . $request->get("timeTo") . ":00' 
or (time(date_end))"

                       . " BETWEEN '" . $request->get("timeFrom") . ":00' AND '" . $request->get("timeTo") . ":00' 
or (time(date_start)) < '" . $request->get("timeFrom") . ":00' and (time(date_end)) > '" . $request->get("timeTo") . ":00') "

Tylko nie wiem jak to zapytanie przerobić, żeby uwzględniało godzinę po 24.

0

Taka mała prośba:
Rozbijaj kod na krótsze linijki, bo jak trzeba suwakiem jeździć, to jest to nieczytelne i strasznie irytuje.
Usuwaj zakomentowany kod, bo tylko utrudnia czytanie.

0

I teraz w momencie kiedy data początkowej daty jest większa od końcowej to wtedy jest inne zapytanie.

if ($timeTo[0] <=  $hour and $timeTo[0] >= 0 and $timeFrom[0] > $timeTo[0]) {
                $this->question->whereRaw("(time(date_start) <= " . "'" . $request->get("timeTo") . ":00' 
or time(date_start) >= " . "'" .  "00:00" . ":00')");

                $this->question->whereRaw("(time(date_end) >= " . "'" .  $request->get("timeFrom") . ":00' 
or time(date_end) <= " . "'" .  $request->get("timeTo") . ":00') ");

                print "dd";
            }
            else {

                $this->question->whereRaw("(time(date_start) BETWEEN '" .  $request->get("timeFrom") . ":00' AND '" . 
$request->get("timeTo") . ":00' or (time(date_end))"

                        . " BETWEEN '" . $request->get("timeFrom") . ":00' AND '" . $request->get("timeTo") . ":00' 
or (time(date_start)) < '" . $request->get("timeFrom") . ":00'
 and (time(date_end)) > '" . $request->get("timeTo") . ":00')");

            }

I to zapytanie by generalnie załatwiło sprawę

 $this->question->whereRaw("(time(date_start) <= " . "'" . $request->get("timeTo") . ":00' 
or time(date_start) >= " . "'" .  "00:00" . ":00')");

                $this->question->whereRaw("(time(date_end) >= " . "'" .  $request->get("timeFrom") . ":00' 
or time(date_end) <= " . "'" .  $request->get("timeTo") . ":00') ");

Tylko, że jak damy przdział czasowy od 23:57 - 00:08 a nastrój będzie w przedziale czasowym 23:58 - 00:05 to wtedy nie wyszuka i teraz na to mam takie zapytanie.

$this->question->whereRaw("((time(date_start) BETWEEN '" .  $request->get("timeFrom") . ":00' AND '" . $request->get("timeTo") . ":00' 
or (time(date_end))"

                       . " BETWEEN '" . $request->get("timeFrom") . ":00' AND '" . $request->get("timeTo") . ":00' 
or (time(date_start)) < '" . $request->get("timeFrom") . ":00' and (time(date_end)) > '" . $request->get("timeTo") . ":00') "

Tylko nie wiem jak to zapytanie przerobić, żeby uwzględniało godzinę po 24.

1 użytkowników online, w tym zalogowanych: 0, gości: 1