[ novmar @ 30.01.2021. 10:08 ] @
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
";
[ ntesic @ 30.01.2021. 18:24 ] @
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
";



[Ovu poruku je menjao ntesic dana 30.01.2021. u 19:38 GMT+1]
[ novmar @ 30.01.2021. 23:04 ] @
super. hvala.
dal postoji rjesenje sa razlicitim vremenima, koja nisu jednaka svaki dan?
kombinacija sa multi BETWEEN i NOT LIKE ne radi kako treba
[ djoka_l @ 31.01.2021. 01:51 ] @
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?
[ djoka_l @ 31.01.2021. 02:08 ] @
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
[ novmar @ 31.01.2021. 16:32 ] @
Hvala na savjetu, probat ću sa dodatnom tabelom
[ bogdan.kecman @ 10.04.2021. 08:50 ] @
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? ...