Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

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

[es] :: MySQL :: pretraživanje po datumu i vremenu, svaki dan različito

[ Pregleda: 417 | Odgovora: 6 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

novmar

Član broj: 221598
Poruke: 30
*.broadband.mtnet.hr.



Profil

icon pretraživanje po datumu i vremenu, svaki dan različito30.01.2021. u 10:08 - pre 5 meseci
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
";
 
Odgovor na temu

ntesic

Član broj: 69927
Poruke: 64
*.dynamic.isp.telekom.rs.



+7 Profil

icon Re: pretraživanje po datumu i vremenu, svaki dan različito30.01.2021. u 18:24 - pre 5 meseci
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]
 
Odgovor na temu

novmar

Član broj: 221598
Poruke: 30
*.broadband.mtnet.hr.



Profil

icon Re: pretraživanje po datumu i vremenu, svaki dan različito30.01.2021. u 23:04 - pre 5 meseci
super. hvala.
dal postoji rjesenje sa razlicitim vremenima, koja nisu jednaka svaki dan?
kombinacija sa multi BETWEEN i NOT LIKE ne radi kako treba
 
Odgovor na temu

djoka_l
Beograd

Član broj: 56075
Poruke: 3066

Jabber: djoka_l


+1312 Profil

icon Re: pretraživanje po datumu i vremenu, svaki dan različito31.01.2021. u 01:51 - pre 5 meseci
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?
 
Odgovor na temu

djoka_l
Beograd

Član broj: 56075
Poruke: 3066

Jabber: djoka_l


+1312 Profil

icon Re: pretraživanje po datumu i vremenu, svaki dan različito31.01.2021. u 02:08 - pre 5 meseci
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
 
Odgovor na temu

novmar

Član broj: 221598
Poruke: 30
*.broadband.mtnet.hr.



Profil

icon Re: pretraživanje po datumu i vremenu, svaki dan različito31.01.2021. u 16:32 - pre 5 meseci
Hvala na savjetu, probat ću sa dodatnom tabelom
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15437
*.dynamic.sbb.rs.

Sajt: mysql.rs


+2342 Profil

icon Re: pretraživanje po datumu i vremenu, svaki dan različito10.04.2021. u 08:50 - pre 3 meseca
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? ...
 
Odgovor na temu

[es] :: MySQL :: pretraživanje po datumu i vremenu, svaki dan različito

[ Pregleda: 417 | Odgovora: 6 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.