Dátum szétbontása hónapokra

Dátum szétbontása hónapokra
2018-11-20T18:37:40+01:00
2018-11-21T16:00:12+01:00
2022-08-11T08:15:29+02:00
lolo81
Sziasztok!

Csináltam egy látogató számlálót, amiben 3 dolgot rögzítek adatbázisban "id, ip, datum".

Az itt letárolt adatokból szeretnék csinálni egy statisztikát "chart.js" évre majd hónapra bontva.

A dátumom rögzítése a következő formában van 2018.11.20.

A chart függvénynek csak az adott hónapban látogatok darabszámait kell átadnom, és majd jövőre már az évet is kell figyelnem.

Szeretnék segítséget kérni milyen módon és mely függvényekkel tudom megvalósítani az év szűrést és az adott hónapban látogatok számot.

Query, While ciklussal szépen ki tudom íratni a tábla tartalmát, a count() függvénnyel meg is tudom számolni, de nem tudom hónapra lebontani a kapott eredményt. Próbálkoztam az Explod() függvénnyel de nem sikerül megfelelően kinyernem az adatót.

A chart függvénynek így kellne átadnom az adatot.

{ labels: ["Január", "Február", "Március", "Április", "Május", "Junius", "Julius", "Agusztus", "Szeptember", "Oktober", "November", "December"], datasets: [{ label: "Látogatók száma 2017-ban", backgroundColor: 'rgba(255, 99, 132, 0.2)', borderColor: 'rgba(255, 99, 132, 1)', data: [40, 20, 13, 34, 64, 22, 9, 23, 56, 30, 21, 5], }
A segítségeket előre is köszönöm.
Mutasd a teljes hozzászólást!
Hali!

Ezzel a lekérdezéssel nem jön vissza sor, nem írja ki a dátumot a while ciklus.

Akkor ott a while-ciklussal lesz a gond. 

A tábla szerkezete

Ez nem szerkezet, ez csak egy dump. Biztosan valamilyen dátum típusú a `datum` meződ (DATE, DATETIME, stb.)?

Nézd meg a következő tesztet: SQL Fiddle (lehet, hogy Chrome-ban nem fut le, Firefox-ban, Edge-ben jó). Létrehoztam a teszt-táblát:
CREATE TABLE `visitor` ( `id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT, `ip` VARCHAR(64) NOT NULL DEFAULT '::1', `datum` DATE NOT NULL, CONSTRAINT `PK_id` PRIMARY KEY (`id`) );
Feltöltöttem teszt-adatokkal:
INSERT INTO `visitor` (`ip`, `datum`) VALUES ('::1', '2018-01-28'), ('::1', '2018-01-29'), ('::1', '2018-02-10'), ('::1', '2018-02-20'), ('::1', '2018-02-25'), ('::1', '2018-05-05'), ('::1', '2018-06-28'), ('::1', '2018-06-28'), ('::1', '2018-06-29'), ('::1', '2018-06-30'), ('::1', '2018-10-10'), ('::1', '2018-10-20'), ('::1', '2018-10-30');
Lefuttattam az előző hozzászólásomban adott SQL-mondatot, az eredménye:
+-------+-----------------+ | month | num_of_visitors | +-------+-----------------+ | 1 | 2 | | 2 | 3 | | 5 | 1 | | 6 | 4 | | 10 | 3 | +-------+-----------------+
Mit rontottam el? 

Mutasd a teljes hozzászólást!

  • Hali!

    Szeretnék segítséget kérni milyen módon és mely függvényekkel tudom megvalósítani az év szűrést és az adott hónapban látogatok számot.

    Csak kulcsszavakkal/-kifejezésekkel:
    - szűrés: WHERE, az évre szűréshez még kellhet a YEAR() függvény is,
    - összeszámolás: COUNT(), értelemszerűen GROUP BY-jal „karöltve”, amit, ha hónapokra szeretnél, akkor még a MONTH() függvény is kellhet.

    A megfelelő SQL-mondat használatával kaphatsz egy 12 sorból álló eredmény-halmazt (ha esetleg nincs még elegendő hónap, akkor egy megfelelő JOIN-nal kiegészítheted), ahol minden sor az adott havi látogatószámot tartalmazza. Ennél pontosabbat csak konkrét infók ismeretében lehetne mondani.

    Mutasd a teljes hozzászólást!
  • MySQL Month függvény használatával a lekérdezésbe beleteszed ezt is:

    select id, ip, date, month(date) m, year(date) y from table

    Aztán ezt js-ben, php-ban felhasználod
    case m of ....  1, 2, ..12 alapján megadod a hónap nevét.
    Mutasd a teljes hozzászólást!
  • Szia,

    A táblámban van:

    1 db 2017-es dátum -> 2017-10-24

    6 db 2018-as dátum -> 2018-10-26 tól 2018-10-31 ig

    13 db 2018-as dátum -> 2018-11-01 től 2018-11-13 ig

    1 db  2019-es dátum -> 2019-10-26

    Megpróbáltam összerakni a sql lekérdezést

    $count = 1; if ( $visitors = $mysql->query( "SELECT datum, COUNT(datum) FROM visitor WHERE YEAR(datum)=2018 GROUP BY MONTH(datum)" ) ) { if ( mysqli_num_rows( $visitors ) ) { while ( $visitor = mysqli_fetch_object( $visitors ) ) { echo $count . ' oldal látogatás ebben az időpontban ' . $visitor->datum . '<br>'; $count ++; } print_r( $visitors); echo '<PRE>'.count( $visitors).'</PRE>'; } }

    eredmény:

    1 oldal látogatás ebben az időpontban 2018-10-26
    2 oldal látogatás ebben az időpontban 2018-11-01
    mysqli_result Object ( [current_field] =&gt; 0 [field_count] =&gt; 2 [lengths] =&gt; [num_rows] =&gt; 2 [type] =&gt; 0 )

    1



    Ahol több sor lenne "10 hó és 11 hó" ott is csak 1 sort ad vissza.

    Az sgl lekérdezés még nem tökéletes, további segítséget / irányt kérnék az összeszámolási részhez.

    A join-t még nem használtam, egy kis extra segítséget megköszönnék kiindulásnak


    Köszönöm.
    Mutasd a teljes hozzászólást!
  • Szia,

    Megpróbáltam az ötleted, de nem vagyok olyan jártas az sql-ban.

    Utána néztem az sql case-nek számomra még elég vad és új :)

    Egy újabb dolog, majd aminek utána nézek :)

    Köszönöm a segítséged, hozzászólásod.
    Mutasd a teljes hozzászólást!
  • Hali!

    A táblámban van

    Lehet, hogy célszerűbb lett volna a táblaszerkezetet megadnod. Ha jól értelmeztem, akkor a következő SQL-mondat megfelelő eredményre vezethet:
    SELECT MONTH(`datum`) AS `month` , COUNT(*) AS `num_of_visitors` FROM `visitor` WHERE YEAR(`datum`) = 2018 GROUP BY MONTH(`datum`) ORDER BY MONTH(`datum`) ASC
    Mutasd a teljes hozzászólást!
  • Szia

    Ezzel a lekérdezéssel nem jön vissza sor, nem írja ki a dátumot a while ciklus.

    Az object tartalma meg viszont ugyan az, és a count()-ra is 1-t számol.

    Érzésem szerint a select elején a hónap választásnál nem passzol valami.

    Néztem a MONTH függvényben is kötőjellel van megadva a dátum, ahogy letárolom. 

    A dátumot így adom meg beíráskor:

    dateTime("Europe/Budapest","Y-m-d")

    A tábla szerkezete:

     +--+---+-------------+
      | id | ip |      datum     |
     +--+---+-------------+
      | 1  | ::1 | 2018-10-28 |
      | 2  | ::1 | 2018-10-29 |
     +--+---+-------------+
    Mutasd a teljes hozzászólást!
  • Hali!

    Ezzel a lekérdezéssel nem jön vissza sor, nem írja ki a dátumot a while ciklus.

    Akkor ott a while-ciklussal lesz a gond. 

    A tábla szerkezete

    Ez nem szerkezet, ez csak egy dump. Biztosan valamilyen dátum típusú a `datum` meződ (DATE, DATETIME, stb.)?

    Nézd meg a következő tesztet: SQL Fiddle (lehet, hogy Chrome-ban nem fut le, Firefox-ban, Edge-ben jó). Létrehoztam a teszt-táblát:
    CREATE TABLE `visitor` ( `id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT, `ip` VARCHAR(64) NOT NULL DEFAULT '::1', `datum` DATE NOT NULL, CONSTRAINT `PK_id` PRIMARY KEY (`id`) );
    Feltöltöttem teszt-adatokkal:
    INSERT INTO `visitor` (`ip`, `datum`) VALUES ('::1', '2018-01-28'), ('::1', '2018-01-29'), ('::1', '2018-02-10'), ('::1', '2018-02-20'), ('::1', '2018-02-25'), ('::1', '2018-05-05'), ('::1', '2018-06-28'), ('::1', '2018-06-28'), ('::1', '2018-06-29'), ('::1', '2018-06-30'), ('::1', '2018-10-10'), ('::1', '2018-10-20'), ('::1', '2018-10-30');
    Lefuttattam az előző hozzászólásomban adott SQL-mondatot, az eredménye:
    +-------+-----------------+ | month | num_of_visitors | +-------+-----------------+ | 1 | 2 | | 2 | 3 | | 5 | 1 | | 6 | 4 | | 10 | 3 | +-------+-----------------+
    Mit rontottam el? 

    Mutasd a teljes hozzászólást!
  • Udv. Leirnad, hogy milyen tipusuak a mezoid a db-ben?
    Mutasd a teljes hozzászólást!
  • Szia!

    Én egy hasonló lekérdezést úgy oldottam meg, hogy csináltam egy view-t, amibe beletettem minden szükséges szüröt kalkulált oszlopként, úgy mint:
    - munkahét
    - negyedév
    - év

    A dátumot a DATEPART fügvénnyel kaptam szét:
     
    Függvény pl:

    DATEPART(year; dbo.tablanev.Date) DATEPART(quarter; dbo.tablanev.Date)
    Eredmény pl:
    Date Year Week Quarter 2018-08-01 2018 31 3 2018-08-16 2018 33 3 2018-08-01 2018 31 3
    Így nem kellett semmi extra varázslat, könnyen és gyorsan elöállítható minden szükséges riport.

    Üdv
    István
    Mutasd a teljes hozzászólást!
  • Hali!

    Ez mennyiben segít a kérdezőnek a MySQL/PHP/Javascript problémáján? 

    Mutasd a teljes hozzászólást!
  • Hali!

    Először hozz létre egy view-t, szerintem egyszerűbb:

    "create view V_VISITORS as
    SELECT
    MONTH('datum') AS 'month'
    , COUNT(*) AS 'num_of_visitors'
    FROM 'visitor'
    WHERE YEAR('datum') = 2018
    GROUP BY MONTH('datum')
    ORDER BY MONTH('datum') ASC"

    utána a while loop:

    if ( $result = $mysql->query( "SELECT * FROM V_VISITORS" ) ) {
    if ( mysqli_num_rows( $result ) ) {
    while ( $visitor = mysqli_fetch_object( $result ) ) {
    echo $visitor->num_of_visitors . ' oldal látogatás ebben az időpontban ' . $visitor->datum . '<br>';
    } // ez a while loop kiírja amit ki kell, ha minden igaz
    }
    u.i.: lehet, hogy az én hibám, de nem látom értelmét a $count paramnak :)
    Mutasd a teljes hozzászólást!
  • Szia,

    Nem a DB-ben és nem is a sql mondattal volt a hiba, hanem a while ciklussal kiíratásnál.

    Mint kiderül még elég kezdő vagyok, de szeretek szerkesztgetni ezzel elütni az unatkozós időm.

    Köszönöm a segítségedet és a türelmedet :)
    Mutasd a teljes hozzászólást!
  • Szia,

    Köszönöm a hozzászólásod, és a kód rész.

    Látom mi a hiba az én while ciklus kiíratássommal :)

    Semmi értelme nincs a $count, még a sima kilistázásnál használtam, hogy hány sor van (látogató).

    Csináltam egy egyszerű látogató számlálót, utána jött az ötlet egy statisztikára ahhoz találtam a chart.js-t amihez teljesen más megközelítés kell :)
    Mutasd a teljes hozzászólást!
  • Szia,

    Helytelen while ciklusom kijavítva.

    Legyen teljes a megoldás, ha lesz hasonló érdeklődés ebben a témában.

    Így már megkapom azon adatokat mik kellenek. Melyik hónapban hány látogató.

    while ( $visitor = mysqli_fetch_object( $visitors ) ) { echo $visitor->Month.' hónapban '.$visitor->num_of_visitors . ' látogatod volt.<br>'; }
    Mutasd a teljes hozzászólást!
abcd