Hirdetés

Keresés

Új hozzászólás Aktív témák

  • szmegma

    aktív tag

    válasz bpx #1377 üzenetére

    az a baj a mysqllel, hogy nincs benne egyszeru "generator" funkcio...

    Mondjuk ez tenyleg gaz.
    Ugy sem megoldhato, hogy PHP generalna ki egy tombbe a datumokat es azt "tolteni be" a lekerdezesbe?

    A PHP tomb kimenete a 31 nap datuma:
    $dates[] = '2013-08-01';
    $dates[] = '2013-08-02';
    $dates[] = '2013-08-03';
    ...

    MYSQL:
    SET dates = '$dates';
    date_add(CURDATE(), interval n.n day)
    FROM dates n

    Csak kerdezem, mivel nem tudok rola szinte semmit. :DDD

    Sk8erPeter Az tuti, hogy ugy lenne jo megcsinalni, hogy nem kene meg evente sem hozzanyulni.

  • szmegma

    aktív tag

    válasz martonx #1361 üzenetére

    Az elso esetet, mint lehetoseget en is megtalaltam a googleban es lehet azon a vonalon megyek.

    Talaltam egy olyan kifejezest, hogy stored procedure. Erre lenne szuksegem?
    Koszi.

  • szmegma

    aktív tag

    Na akkor egy temaba illo kerdes.
    Pusztan pelda ertekkel biro kod, mivel fingom sincs:

    SELECT BETWEEN (DATE(CURDATE()+1) AND DATE_ADD(CURDATE()+1, INTERVAL 31 DAY)) AS dates

    Hogyan lehet, kimenetkent megkapni a holnapi es azt azt koveto 31 nap datumait (31 darab rekord)? A fenti kodban probaltam szemleltetni, hogy egy hasonlo lekeressel a dates segedoszlopban szeretnem megkapni a kivan 31 nap datumat.

  • szmegma

    aktív tag

    válasz Apollo17hu #1348 üzenetére

    Eloszor erre valaszolnek, mert lehet talaltam egy hibat a CASE-ben.
    Azt szurjuk ugye, hogy

    workers_finish_timestamp > estimated_completion_time
    AND
    workers_start_timestamp < desired_start_time
    THEN => 'nem vallalhatja el' <= igaz, ha az AND elotti es utani resz IGAZ
    ELSE => 'elvallalhatja' <= igaz, ha az AND elotti es/vagy utani resz HAMIS

    DE! Ez nem minden esetben mutatja a helyes kimenetet (szabad vagy nem szabad a munkas). Pl.:

    1, mukodik - kod szerint nem vallalhatja el es ez IGAZ
    IF workers_start_timestamp(06:30) < desired_start_time(08:00) <= igaz
    AND workers_finish_timestamp(11:30) > estimated_completion_time(10:00) <= igaz

    2, nem mukodik - kod szerint elvallalhatja es ez NEM IGAZ
    IF workers_start_timestamp(10:00) < desired_start_time(06:00) <= hamis
    AND workers_finish_timestamp(15:00) > estimated_completion_time(07:00) <= igaz

    3, nem mukodik - kod szerint elvallalhatja es ez NEM IGAZ
    IF workers_start_timestamp(08:30) < desired_start_time(08:00) <= hamis
    AND workers_finish_timestamp(14:30) > estimated_completion_time(11:00) <= igaz

    4, mukodik - kod szerint elvallalhatja es ez IGAZ
    IF workers_start_timestamp(15:00) < desired_start_time(07:00) <= hamis
    AND workers_finish_timestamp(17:00) > estimated_completion_time(13:00) <= igaz

    5, nem mukodik - kod szerint elvallalhatja es ez NEM IGAZ
    IF workers_start_timestamp(07:30) < desired_start_time(09:00) <= igaz
    AND workers_finish_timestamp(10:30) > estimated_completion_time(15:00) <= hamis

    6, mukodik - kod szerint elvallalhatja es ez IGAZ
    IF workers_start_timestamp(13:30) < desired_start_time(09:00) <= hamis
    AND workers_finish_timestamp(17:30) > estimated_completion_time(11:00) <= igaz

    7, nem mukodik - kod szerint elvallalhatja es ez NEM IGAZ
    IF workers_start_timestamp(16:00) < desired_start_time(16:00) <= hamis
    AND workers_finish_timestamp(19:00) > estimated_completion_time(19:00) <= hamis

    8, mukodik - kod szerint elvallalhatja es ez IGAZ
    IF workers_start_timestamp(12:30) < desired_start_time(10:30) <= hamis
    AND workers_finish_timestamp(15:30) > estimated_completion_time(12:30) <= igaz

    Papirra levezettem par peldat es melle irtam par kezdesi es befejezesi idopontot es a keplet ezek felet jol kezelte, a masik felet rosszul, azert is merultem el jobban benne.
    Amit leirtam igazam van, vagy hulyeseget beszelek?

  • szmegma

    aktív tag

    válasz Apollo17hu #1343 üzenetére

    ...a workers_starting és workers_finishing mit jelent?

    A workers_starting az a munkas elso foglalt idopontjat jelzi (pl., 2013-09-10 08:00:00), a workers_finishing pedig a munkas utolso foglalt idopontja (pl., 2013-09-10 11:00:00). Szoval ha csak o lenne egyedul a cegnel, es vki rendelest akarna leadni 11:00 orara, akkor a fenti pelda alapjan leadhatja, mivel a munkas 11 orakor mar raer.
    Magyarul, az adott munkas CSAK a workers_starting és workers_finishing idokozott nem er ra, elotte es utana raer.

    Megcsinaltam amit irtal WHERE kriteriumot es ezt dobta a MySQL eredmenykent:
    array(11) {
    ["booking_id"]=>"4"
    ["cheking_time"]=>"11:30"
    ["jobs_id"]=>"4"
    ["starting_timestamp"]=>"1366884000"
    ["number"]=>"8"
    ["workers_id"]=>"2"
    ["workers_start_hour"]=>"09:30"
    ["workers_finish_hour"]=>"18:30"
    ["workers_working_date"]=>"2013-04-25"
    ["interval_start"]=>"2013-07-28"
    ["interval_end"]=>"2013-08-28"
    ["oszlop"]=>"true"
    }

    Ha jol ertem, akkor ez mar CSAK ["oszlop"]=>"true" erteku munkast dob vissza? Magyarul aki biztos nem er ra.
    Idokozben kiderult itt egy ujabb dolog. Megpedig, hogy nem csak egyetlen idopontot kell vizsgalnia a keresnek, hanem ido intervallumot.
    Szoval nem csak a 8 orai pillanatot kell ellenorizni, hanem a kivalasztott munka hosszatol fuggoen, a 08:00-tol, a munka befejezeseig terjedo intervallomot kellene vizsgalni.
    Tehat amikor kivalasztja vki a 08:00, akkor mar adott, (korabban beallitott) hogy meddig fog a munka tartani.
    Pl., 3 oras, tehat 08:00 es 11:00 ora kozotti idopontokat kell vizsgalni, hogy ne fedje legalabb egy munkas foglaltnak jelzett idointervallumjat.

    Remelem ez az apro valtozas tul sokat nem erinti az eddig elkeszitett projectet.
    Ha a fenti kod jol mukodik, vagyis az elgondolasod szerint, akkor most mi a kovetkezo lepes?

    Koszonom.

  • szmegma

    aktív tag

    válasz Apollo17hu #1341 üzenetére

    Na ez erdekes. Termeszetesen igazad lett, a CASE nem veszi be a FROM_UNIXTIME(workers_finishing,'%H%i')*1 egyeni elnevezeset. :F
    Plusz syntax hiba is volt.

    Elso verzio: osszes oszlop = TRUE, ha megforditom a kacsacsort, akkor is TRUE!

    $cheking_time = '7:30';

    (CASE WHEN
    '1 < ".$cheking_time."'
    THEN
    'true'
    ELSE
    'false' END) AS 'oszlop'

    Masodik verzio: osszes oszlop = TRUE, am ha megforditom a kacsacsort, akkor FALSE lesz

    $cheking_time = '7:30';

    (CASE WHEN
    1 < ".$cheking_time."
    THEN
    'true'
    ELSE
    'false' END) AS 'oszlop'

    Harmadik verzio: oszlop1 = FALSE, oszlop2 = FALSE, oszlop3 = TRUE, oszlop4 = FALSE

    $cheking_time = '19:30';

    (CASE WHEN
    FROM_UNIXTIME(workers_finishing,'%H%i')*1 > '".$cheking_time."'
    AND
    FROM_UNIXTIME(workers_starting,'%H%i')*1 < '".$cheking_time."'
    THEN
    'true'
    ELSE
    'false' END) AS 'oszlop'

    Mint lathato, mostmar a SELECT resz mukodik. :R

    Az uj kod:

    SELECT
    booking_sheet.booking_id,
    jobs_sheet.booking_id,
    jobs_id,
    starting_timestamp,
    number,
    workers_id,
    workers_starting,
    workers_finishing,
    FROM_UNIXTIME(workers_starting,'%Y-%m-%d') AS workers_working_date,
    DATE(CURDATE()+1) AS interval_start,
    DATE_ADD(CURDATE()+1, INTERVAL 31 DAY) AS interval_end,
    (CASE WHEN
    FROM_UNIXTIME(workers_finishing,'%H%i')*1 > '".$cheking_time."'
    AND
    FROM_UNIXTIME(workers_starting,'%H%i')*1 < '".$cheking_time."'
    THEN
    'true'
    ELSE
    'false' END) AS 'oszlop'
    FROM
    jobs_sheet
    INNER JOIN
    booking_sheet
    ON
    jobs_sheet.booking_id=booking_sheet.booking_id

    A korabbi kerdesedre valaszolva, bevittem a SELECT-be azt a 31 napos idointervallumot (interval_start es interval_end), amibol szurnie kellene, hogy mely napokon van legalabb egy szabad ember 08:00-kor.
    Vegulis a lenyege ennek az lenne, hogy egy arrayba gyujtse ossze ezeket a napokat.

    A 100 lepesbol tizet megtettunk! :C
    A FROM utan kellene letrehozni azokat az allekerdezeseket ugye? Olvasgattam utana, de ez a "SELECT beagyazasa masik lekeresbe" tema nem konnyen emesztheto szamomra.
    Meg azt sem tudom, hogy az INNER JOIN kapcsolat jo ide? Olvastam LEFT, RIGHT, FULL, NATURAL es INNER tipusokrol, de nem tudom, mikor melyik ajanlott.
    Esetleg elobb a WHERE utasitasokat kellene meghatarozni?

    Koszonom.

  • szmegma

    aktív tag

    válasz Apollo17hu #1339 üzenetére

    Nagy szenvedessel eddig jutottam a koddal:

    $cheking_time = '7:30';

    $info_get = "
    SELECT
    jobs_id,
    starting_datetime,
    number,
    workers_id,
    FROM_UNIXTIME(workers_starting,'%H%i')*1 AS workers_start_hour,
    FROM_UNIXTIME(workers_finishing,'%H%i')*1 AS workers_finish_hour,
    FROM_UNIXTIME(workers_starting,'%Y-%m-%d') AS workers_working_date,
    DATE(CURDATE()+1) AS interval_start,
    DATE_ADD(CURDATE()+1, INTERVAL 31 DAY) AS interval_end,
    (CASE WHEN
    'workers_start_hour < ".$cheking_time."' AND 'workers_finish_hour > ".$cheking_time."'
    THEN
    'true'
    ELSE
    'false' END) AS 'oszlop'
    FROM
    booking_sheet
    INNER JOIN
    jobs_sheet
    ON
    booking_sheet.booking_id=jobs_sheet.booking_id
    ";

    Viszont a segedoszlop nem mukodik. Mindenre "false"-t dob. Pedig a negy bejegyzett mukak kozul egyik igaz a kriteriumra. Nem tudtam rajonni miert.

    A FROM utani resz pedig meg ennyire sem ment.
    Eddig legalabb jo uton halodok?

    Koszonom.

  • szmegma

    aktív tag

    válasz Apollo17hu #1337 üzenetére

    "Ha tényleg ennyire 0-ról indulsz, akkor ez nagyon necces."

    Sajnos ez igaz, de konnyen tanulok es akarok is tanulni. Olvasgatom a SQL lekerdezesek foldi halandoknak 2009 c. konyvet es mar sok ujdonsagot tudtam meg.
    Pl., az a NATURAL JOIN is onnan szarmazik, ami annyit tesz, a ket osszekapcsolando tablaban, ugyeber minimum egy mezo nevenek meg kell egyezni mindket tablaban. Itt jon a kepbe a natural join, ha CSAK egy mezo neve egyezik meg es pont az amelyiken at vezerelni akarjuk a lekerdezest, akkor lehet hasznalni a natural join-t.

    "A "munkás, munkaidő_start, munkaidő_end, foglalt_start, foglalt_end" listában minden sorra meghatároznám (segédoszloppal), hogy az adott sorban lehetséges-e a kívánt munkát (időpont alapján) végezni (IF, AND és OR megfelelő kombinációjával). Ezután munkások munkanapjaiként csoportokat készítenék analitikus függvénnyel, ami megmutatná, hogy adott munkás adott munkanapján van-e ütközés (az előbb létrehozott segédoszlop). Ahol nincs ütközés, azt a munkást, és azt a napot adná vissza az eredmény"

    Sajnos ez igy nekem tul magas, nem tom mi az a segedoszlop. Megprobalok hetvegen melyebben utana olvasni de igy az elso kereses a google-vel, nem eredmenyezett kielegito talalatot.

    Koszonom.

  • szmegma

    aktív tag

    válasz Apollo17hu #1326 üzenetére

    Az elso bekezdesed elso fele kesz van. Pont en is igy talaltam ki tegnap melo kozben, hazajottem es meg is csinaltam.
    A masodik fele, a lekerdezes, mar nehezebb, mivel csak tablakat tudok osszekapcsolni, mezoket nem tudom, hogy kell.

    Jelenleg itt tartok, ezzel megkapok minden infot amire szuksegem van, csak nem tudom, hogyan tovabb:
    SELECT jobs_id,starting_datetime,number,workers_id,workers_starting,workers_finishing,regularity FROM booking_sheet NATURAL JOIN jobs_sheet

    Szoval megkapom az osszes munkas beosztasat az ID-vel egyutt, hogy mettol-meddig nem er ra, mivel dolgozik, ezutan, hogyan kell lekerdezni, hogy mondjuk az osszes munkas kozul van-e legalabb egy olyan, aki az elkovetkezendo 1 honapi datumokon raer, vagyis nem dolgozik 08:00-kor es csak azokat a datumokat listazza ki?

    Jelenleg igy nez ki a jobs_sheet adatbazis:
    CREATE TABLE IF NOT EXISTS `jobs_sheet` (
    `jobs_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
    `booking_id` int(10) unsigned NOT NULL,
    `workers_id` int(10) unsigned NOT NULL,
    `workers_starting` datetime NOT NULL,
    `workers_finishing` datetime NOT NULL,
    PRIMARY KEY (`jobs_id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=5 ;

    INSERT INTO `jobs_sheet` (`jobs_id`, `booking_id`, `workers_id`, `workers_starting`, `workers_finishing`) VALUES
    (1, 1, 1, '2013-01-15 07:30:00', '2013-01-15 11:30:00'),
    (2, 2, 2, '2013-02-11 11:30:00', '2013-02-11 14:30:00'),
    (3, 3, 1, '2013-04-05 05:30:00', '2013-04-05 11:30:00'),
    (4, 4, 2, '2013-04-25 09:30:00', '2013-04-25 18:30:00');

    A masodik bekezdesedet, sztem hagyjuk, eloszor mukodjon ez elobbi es utana lehet gondolkodni, hogyan kellene modositani, hogy az ismetlodeseket is figyelembe vegye.
    Koszonom a segitsegedet. :R

  • szmegma

    aktív tag

    válasz Apollo17hu #1320 üzenetére

    Termeszetesen tobb mezo van, csak a lenyegeseket irtam be.
    A datumokat egy php funkcio generalja, mindig az aktualis nap es az azt koveto 30 nap datumait listazza ki a selectbe.
    A szoveges leiras passzol, mivel a 10 karakteru szamok (1358236800) timestamp ertekek, ezek taroljak a full idot: 2013-01-15 08:00:00
    Az elozo irasomat megprobalom leegyszerusiteni:

    Egy selectben levo ora erteket kivalasztva (pl. 08:00), fusson vegig a munkasok adatain, hogy 8 orakor melyik datumokon (maximum 30 napra elore) van legalabb egy szabad ember?

    Elso variacio (hasra utott ertekek alapjan):
    Ha 2013-08-08 napjan 6 orakor az elso munkas dolgozik es 9 orakor fejezi be, akkor o nem szabad.
    Ha 2013-08-08 napjan 9 orakor a masodik munkas dolgozik es 11 orakor fejezi be, akkor o nem szabad.
    Ha 2013-08-08 napjan 8 orakor az utolso munkas dolgozik es 9 orakor fejezi be, akkor o nem szabad.
    Vegignezte a munkasokat, hogy ki-mikor dolgozik es a 2013-08-08 datum nem szabad, mivel mindenki foglalt a kivalasztott oraban (08:00).
    Igaz, hogy a masodik munkas nem dolgozik 8 orakor, hanem 9-kor kezd, de 1 orat kell szamolni mindket iranyba, amit foglaltnak veszunk.

    Masodik variacio (hasra utott ertekek alapjan):
    Ha 2013-08-08 napjan 6 orakor az elso munkas dolgozik es 9 orakor fejezi be, akkor o nem szabad.
    Ha 2013-08-08 napjan 10 orakor a masodik munkas dolgozik es 11 orakor fejezi be, akkor o szabad.
    Ha 2013-08-08 napjan 8 orakor az utolso munkas dolgozik es 9 orakor fejezi be, akkor o nem szabad.
    Vegignezte a munkasokat, hogy ki-mikor dolgozik es a 2013-08-08 datum szabad, mivel a masodik munkas nem dolgozik a kivalasztott oraban (08:00).

    Igy mar tisztabb?

    Elarulom, hogy az adatbazis tablak mezoi meg nem veglegesek; folyamatosan szerkesztem, ha mashogy jobbnak latom.
    Pl., ezt a +- 1orat is amit az elso variacioban emlitettem, vhogy mashogy fogom megoldani, valoszinuleg eltavolitom a finishing_datetime mezot, mivel felesleges, hiszen a kezdo idopontbol egy orat le kell vonni, ehhez a munka hosszat hozzaadni + meg 1 orat es mar meg is van egy munkas napi idolefedettsege.

    Koszonom.

  • szmegma

    aktív tag

    válasz martonx #1318 üzenetére

    Par oranyi munka? Akkor ezert nem sikerult nekem. :DDD

    Ha penzt ajanlok erte, mennyit kostal?

  • szmegma

    aktív tag

    Egy MySql gurura lenne szuksegem az alabbi problemammal kapcsolatban.

    Van 3 tabla. A booking_sheet, jobs_sheet es workers_sheet.
    A booking_sheet tartalmazza egy leadott megrendeles adatait:

    `booking_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
    `starting_datetime` int(10) unsigned NOT NULL,
    `regularity` tinyint(2) unsigned DEFAULT NULL,
    PRIMARY KEY (`booking_id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8 ;

    Tegyuk fel van 3 megrendeles (booking_id,starting_datetime,regularity):
    1, 1358236800, 14
    2, 1360584000, 7
    3, 1365141600, NULL

    A jobs_sheet, a fonok booking_sheet altal kiosztott munka adatait tartalmazza. Beallitja a munka vegenek idopontjat es egy mukas ID-jet rendeli hozza:

    `jobs_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
    `booking_id` int(10) unsigned NOT NULL,
    `workers_id` int(10) unsigned NOT NULL,
    `finishing_datetime` int(10) unsigned NOT NULL,
    PRIMARY KEY (`jobs_id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8 ;

    Tegyuk fel van 3 ekeszitett rekord (jobs_id,booking_id,workers_id,finishing_datetime):
    1, 1, 2, 1358251200
    2, 2, 3, 1360594800
    3, 3, 1, 1365163200

    A workers_sheet pedig a munkasok adatait tartalmazza:

    `workers_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
    `workers_name` varchar(255) NOT NULL,
    PRIMARY KEY (`workers_id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8 ;

    Tegyuk fel van 3 munkas (workers_id,workers_name):
    1, Jozsi
    2, Geza
    3, Bela

    Egy megrendelo lapot keszitek, ahol orat es datumot kell kivalasztani az ugyfelnek.
    Ha mondjuk kivalasztja a 08:00, akkor ugy kellene lefutnia egy keresnek, hogy 8 orakor melyik napon van legalabb egy szabad ember es azokat a napokat adja vissza a datumvalasztoba.
    Csak, hogy ne legyen ilyen egyszeru, mint latjatok van egy regularity mezo, mely azt adja meg, hogy az elso kivant munkanap utan, hany nap mulva kell ujra az adott idopontban menni dolgozni.

    A fenti peldak szoveges formaban:

    Az 1. szamu melot 2013-01-15 08:00:00-kor Geza kezdi, melynek befejezese 2013-01-15 12:00:00-kor es 14 naponkent ismetlodik, tehat 2013-01-29 08:00:00-kor ujra kezdi stb.
    A 2. szamu melot 2013-02-11 12:00:00-kor Bela kezdi, melynek befejezese 2013-02-11 15:00:00-kor es 7 naponkent ismetlodik, tehat 2013-02-18 12:00:00-kor ujra kezdi stb.
    A 3. szamu melot 2013-04-05 06:00:00-kor Jozsi kezdi, melynek befejezese 2013-04-05 12:00:00-kor es nem ismetlodik.

    Na mar most, ha vki a megrendelo lapon kivalasztja a 08:00, akkor lathato, hogy minden datum szabad esmegjelenitheto, hiszen legalabb egy munkas szabad barmelyik napon 8 orakor.

    Szamomre ez a kerdes igencsak meghaladja a tudasom, pedig ezt a hetveget MySql tanulassal toltottem. Sok mindent tanultam, de ezt nem tudom megoldani egyedul. :U
    Ha vki tudna segiteni, halas lennek.

    Koszonom.

Új hozzászólás Aktív témák