Munkával töltött idő lekérdezése

Munkával töltött idő lekérdezése
2014-09-28T12:10:57+02:00
2014-09-28T15:20:20+02:00
2022-12-01T15:35:40+01:00
mzsotya
Sziasztok!
Van egy ilyen szerkezetű táblám:

CREATE TABLE [dbo].[blokkolasok](
[ID] [int] IDENTITY(1,1) NOT NULL,
[dolgozoID] [int] NULL,
[projektID] [int] NULL,
[statusID] [int] NULL,
[idopont] [varchar](50) NULL)

dolgozoID: dolgozó azonosítása
projektID:   melyik munkán dolgozik
statusID:     kezdi vagy befejezi a munkát
idopont:     a kezdés vagy befejezés időpontja

Azonos dolgozoID és projektID-vel rendelkező kezdés és befejezés időpontja közti idő a munkával töltött idő.

Hogyan tudnám lekérdezni egy adott dolgozó, adott projekten végzett munkával töltött idejét egy adott időszakra?
Köszönöm.
Mutasd a teljes hozzászólást!
Mi lenne ha máshogy nézne ki a tábla.
Mondjuk minden rekordban lenne egy  kezdő időpont és egy befejező időpont.
Így mindjárt könnyebb lenne az életed.
Mutasd a teljes hozzászólást!

  • Azonos dolgozoID és projektID-vel rendelkező

    Ha jól mennek a bevitelek, akkor két ilyen rekord létezik, ahogy én értelmezem..
    Az egyikben a kezdés a másikban a befejezés ideje legyen időbélyegben...
    Így ha megfelelő msql keresést írsz, akkor a két mező különbségét kell csak óra/perc formátumban kiszámolni...
    A keresési feltétel összeállítása meg nem lehet gond...
    Mutasd a teljes hozzászólást!
  • Mi lenne ha máshogy nézne ki a tábla.
    Mondjuk minden rekordban lenne egy  kezdő időpont és egy befejező időpont.
    Így mindjárt könnyebb lenne az életed.
    Mutasd a teljes hozzászólást!
  • Csak lehet, hogy az már nehezebb lenne a kérdezőnek, mert akkor már UPDATE is kellene feltétellel a vége időpont bevitelére...
    Bár ha ez nem gond, célszerűbb lenne...
    Így marad a DESC, hogy előbb a vége-időontot kapja meg...
    Mutasd a teljes hozzászólást!
  • Több rekord is lehet, hiszen egy projekten tobb napig is dolgozhat, sot lehet egy nap több projekten is dolgozi, tehat egyiket befejezi masikat elkezdi.
    Mutasd a teljes hozzászólást!
  • Elkezd insert, befejez update.
    Hhmm.
    Csak akkor mindig meg kell talalni a megfelelő rekordot update előtt.
    Mutasd a teljes hozzászólást!
  • SELECT SUM(IFNULL(( SELECT idopont FROM blokkolasok WHERE projektID = pID AND dolgozoID = dID AND statusID = befejezoID AND idopont > b1.idopont ORDER BY idopont LIMIT 1 ),NOW()) - b1.idopont) FROM blokkolasok as b1 WHERE b1.projektID = pID AND b1.dolgozoID = dID AND b1.statusID = kezdesID AND b1.idopont >= idoszakKezdes AND b1.idopont <= idoszakVege;
    Na jó, írtam egy ilyet, remélem nem túl nagy baromság.
    Mutasd a teljes hozzászólást!
  • Több szempontból is nehezítettél a saját dolgodon:
    1. én ezt nem két rekordonként tárolnám, hanem egyben: idopont helyett kezd, befejez mezőkkel
    2. mi az, hogy az idopont varchar????? Mi a fenének van szerinted datetime típus?
    3. Soha nem fogod megtudni, ha kétszer blokkol startot, de egyszer sem blokkol endet vagy fordítva

    +1 miért nullable az összes mező?
    Mutasd a teljes hozzászólást!
  • Egyébként valami ilyesmi lesz, de ez csak tökéletesen kitöltött adatok alapján működik. Egyéb:
    - StatusID: 0 - Start, 1 - finish
    - idopont datetime

    Teljes script:

    truncate table blokkolasok insert into blokkolasok (dolgozoID, projektID, statusID, idopont) values (1, 1, 0, '2014-09-28 10:00:00'), (1, 1, 1, '2014-09-28 12:00:00'), (1, 2, 0, '2014-09-27 12:00:00'), (1, 2, 1, '2014-09-27 13:00:00'), (2, 1, 0, '2014-09-26 10:00:00'), (2, 1, 1, '2014-09-26 15:00:00') select b.dolgozoID, b.projektID, b.start, b.[end], DATEDIFF(minute, b.start, b.[end]) [worktime] from (select b1.dolgozoID, b1.projektID, b1.idopont [end], (select MAX(b2.idopont) from blokkolasok b2 where b2.idopont < b1.idopont and b2.dolgozoID = b1.dolgozoID and b2.projektID = b2.projektID and b2.statusID = 0) [start] from blokkolasok b1 where statusID = 1) b

    Eredmény:
    dolgozoID projektID start end worktime ----------- ----------- ----------------------- ----------------------- ----------- 1 1 2014-09-28 10:00:00.000 2014-09-28 12:00:00.000 120 1 2 2014-09-27 12:00:00.000 2014-09-27 13:00:00.000 60 2 1 2014-09-26 10:00:00.000 2014-09-26 15:00:00.000 300
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd