Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

pretraživanje po datumu i vremenu, svaki dan različito

  • 6 odgovora
  • 4.111 pregleda

Najnovija ↓

pretraživanje po datumu i vremenu, svaki dan različito 30.01.2021. u 11:08 · pre 70 meseci #1
Kako u ovo ubaciti još i pretraživanje po datumu i vremenu ali da bude različito vrijeme za određeni datum.
Radi ako stavim multiple NOT BETWEEN, ali mi je malo komplicirano jer imam vremena od-do (2021-01-28 17:00:00 - 2021-01-28 21:00:00)
created_at je u formatu (2021-01-28 00:00:00)

$sql = "
SELECT tab1, tab2, COUNT(*) AS count_tab, created_at, max(created_at) as max_tab
FROM cust_tab
WHERE created_at between adddate(now(),-6) and now()
AND tab2 NOT LIKE '%In%'
AND tab1 NOT LIKE '1_'
AND tab1 NOT LIKE ''
AND created_at NOT BETWEEN '2021-01-29 07:00:00' AND '2021-01-29 17:00:00'
AND created_at NOT BETWEEN '2021-01-28 21:00:00' AND '2021-01-29 06:00:00'
AND created_at NOT BETWEEN '2021-01-28 07:00:00' AND '2021-01-28 17:00:00'
AND created_at NOT BETWEEN '2021-01-28 21:00:00' AND '2021-01-27 06:00:00'
AND created_at NOT BETWEEN '2021-01-27 07:00:00' AND '2021-01-27 17:00:00'
AND created_at NOT BETWEEN '2021-01-27 21:00:00' AND '2021-01-26 06:00:00'

GROUP BY tab2,tab1
HAVING (COUNT(*) > 3)
ORDER BY count_tab DESC, max_tab DESC
LIMIT 10
";
Re: pretraživanje po datumu i vremenu, svaki dan različito 30.01.2021. u 19:24 · pre 69 meseci
izmenjeno 1 put, poslednji put ntesic 30.01.2021. u 19:38
  1. ntesic30.01.2021. u 19:38zapis iz teksta poruke
#2
Posto izgleda da ima neki patern, i predpostavljam da radis sa PHP, mozda je bolje da generises query njime, nesto ovako:

Code:

$begin = new DateTime( "2021-01-29" );
$end   = new DateTime( "2021-01-27" );
$appendWhere = [];

for($i = $begin; $i >= $end; $i->modify('-1 day')){
    $e = clone($i);
    $e->modify('-1 day');
    $appendWhere[] = " AND created_at NOT BETWEEN '" . $i->format('Y-m-d')." 07:00:00' AND '" . $i->format('Y-m-d') ." 17:00:00'";
    $appendWhere[] = " AND created_at NOT BETWEEN '" . $e->format('Y-m-d')." 21:00:00' AND '" . $i->format('Y-m-d') ." 06:00:00'";
}

$sql = "
SELECT tab1, tab2, COUNT(*) AS count_tab, created_at, max(created_at) as max_tab
FROM cust_tab
WHERE created_at between adddate(now(),-6) and now()
AND tab2 NOT LIKE '%In%'
AND tab1 NOT LIKE '1_'
AND tab1 NOT LIKE ''
" . implode ("\n", $appendWhere) . "
GROUP BY tab2,tab1
HAVING (COUNT(*) > 3)
ORDER BY count_tab DESC, max_tab DESC
LIMIT 10
";


Dobices tipa:
Code:

$sql = "
SELECT tab1, tab2, COUNT(*) AS count_tab, created_at, max(created_at) as max_tab
FROM cust_tab
WHERE created_at between adddate(now(),-6) and now()
AND tab2 NOT LIKE '%In%'
AND tab1 NOT LIKE '1_'
AND tab1 NOT LIKE ''
AND created_at NOT BETWEEN '2021-01-29 07:00:00' AND '2021-01-29 17:00:00'
AND created_at NOT BETWEEN '2021-01-28 21:00:00' AND '2021-01-29 06:00:00'
AND created_at NOT BETWEEN '2021-01-28 07:00:00' AND '2021-01-28 17:00:00'
AND created_at NOT BETWEEN '2021-01-27 21:00:00' AND '2021-01-28 06:00:00'
AND created_at NOT BETWEEN '2021-01-27 07:00:00' AND '2021-01-27 17:00:00'
AND created_at NOT BETWEEN '2021-01-26 21:00:00' AND '2021-01-27 06:00:00'
GROUP BY tab2,tab1
HAVING (COUNT(*) > 3)
ORDER BY count_tab DESC, max_tab DESC
LIMIT 10
";
Re: pretraživanje po datumu i vremenu, svaki dan različito 31.01.2021. u 02:51 · pre 69 meseci #4
Kao neko sa 25 godina iskustva sa bazama, nadam se da nećeš da se uvrediš ako ti pokažem gde grešiš.

Pre svega, iz iskustva ti kažem da kad naletiš na neki upit koji je teško da se sprovede, najčešći razlog za to je greška u dizajnu.

Radiš upit iz tabele cust_tab i na neki način pokušavaš da izbaciš događaje koji su se desili u nekom momentu.
U kom momentu znaš da ti to ne treba?
Ako znaš odmah, u momentu upisa u slog, zašto ne bi uneo polje koje bi imalo vrednost 1/0, na primer zabranjeno_vreme,
pa na osnovu tog polja selektovao slogove, umesto da pišeš gomile between klauzula?

Opet, u primeru koji si dao, nisi dobro napisao uslove.

AND created_at NOT BETWEEN '2021-01-28 21:00:00' AND '2021-01-27 06:00:00'

AND created_at NOT BETWEEN '2021-01-27 21:00:00' AND '2021-01-26 06:00:00'

U oba ova uslova je krajnji datum manji od početnog datuma i red je potpuno nebitan. NOT BETWEEN je uvek tačno.

Po primeru koji si dao, ispada da uvek želiš da odbaciš slogove ako su vremena između 07:00 i 17:00, kao i između 21:00 06:00 sledećeg dana.
Ako je to tačno, zašto ne porediš samo sate, a ne kompletne datume?
U stvari, izgleda da su tebi bitni samo događaji >6 and <7 i >17 and <21 .
Ovako napravljen uslov je mnogo prostoji od nebrojenih redova sa NOT BETWEEN.

I, na kraju, ako ne znaš unapred vremenske okvire za koje ne želiš da dobiješ slogove, zašto ne napraviš dodatnu tabelu u kojoj ćeš zabeležiti vremena (ispravno),
pa da onda jednim joinom ne proveriš da li vreme nastanka sloga upada u zabranjeno vreme?
Re: pretraživanje po datumu i vremenu, svaki dan različito 31.01.2021. u 03:08 · pre 69 meseci #5
I još jedna zamerka: kada postavljaš pitanja u vezi upita, uvek napravi primer, test tabele, upit i šta očekuješ kao rezultat, pa će ti pomoć biti pružena mnogo brže:

Code (sql):
CREATE TABLE Test(id INTEGER, vreme datetime);
INSERT INTO Test(id, vreme) VALUES(1, "2021-01-31 06:30");
INSERT INTO Test(id, vreme) VALUES(2, "2021-01-31 07:30");
INSERT INTO Test(id, vreme) VALUES(3, "2021-01-31 09:00");
CREATE TABLE zabranjeno(od datetime, do datetime);
INSERT INTO zabranjeno (od, do) VALUES ("2021-01-31 07:00", "2021-01-31 17:00");
SELECT * FROM Test;
SELECT * FROM zabranjeno;

SELECT * FROM Test t
WHERE NOT EXISTS (SELECT 1 FROM zabranjeno z WHERE t.vreme BETWEEN z.od AND z.do);


Code:
id    vreme
1    2021-01-31 06:30:00
2    2021-01-31 07:30:00
3    2021-01-31 09:00:00
od    do
2021-01-31 07:00:00    2021-01-31 17:00:00
id    vreme
1    2021-01-31 06:30:00
Re: pretraživanje po datumu i vremenu, svaki dan različito 10.04.2021. u 09:50 · pre 67 meseci #7
postavi sebi sledeca pitanja

1. STA tacno hocu da dobijem
2. ZASTO hocu to da dobijem

to ce ti pomoci da napravis upit.

na primer, ako ti treba razlicito vreme za svaki dan, ZASTO je to vreme razlicito? Najverovatnije zato sto se nesto desava u to vreme tog dana, ako je tako, to treba da je vec u nekoj tabeli, i onda radis join sa tom tabelom, ako nije u tabeli, ZASTO nije? ...
Potpis
arhimed
http://www.mysql.rs/ | http://elco.crsndoo.com/
Sviđa mi se1
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme