FireBird idő intervallum

FireBird idő intervallum
2007-02-16T18:51:17+01:00
2007-03-02T18:01:59+01:00
2022-11-03T15:35:35+01:00
lid3rc
Sziasztok!

FireBird 1.5-ös adatbázist használok
(SQL 3 dialektusban, ha ez számít)

Így néz ki a tábla:
CREATE TABLE TABLA (
CEG INTEGER,
STARTIDO TIME,
ENDIDO TIME);

Hogy lehet ebben a következő lekérdezést szintaktikailag helyesen beírni?

SELECT
TABLA.CEG,
SUM(TABLA.ENDIDO – TABLA.STARTIDO) AS INTERVALLUM
FROM
TABLA
GROUP BY
TABLA.CEG

Az a lényeg hogy az időintervallumokat szeretném összesíteni cégekre lebontva méghozzá úgy, hogy az eredményben az időintervallumot Gird ben megjeleníthető idő formátumban kapjam vissza, ne real típusként.

Ez lenne a szebb megoldás, de ha ez nem lehetséges az is érdekel, hogy lehet Delphiben a felhasználó számára emészthetőbb formátummá alakítani (természetesen itt is a rácsban).

A segítséget előre is köszönöm.
Balu
Mutasd a teljes hozzászólást!
Sajnos a Zeos-hoz nem értek, de szerintem ez megoldja a gondodat! Field editorból töröld ki a mezőt, majd adj hozzá egy újat! A felviteli felületen a névnek add meg a mező nevét és a type valószínüleg egyből beállítódik real-re! Ezt rakd át datetime-ra és valószínüleg működni fog! Ja és a field type legyen data, mert ha jól tudom defaultként calculated lesz!
Mutasd a teljes hozzászólást!

  • Hogy lehet ebben a következő lekérdezést szintaktikailag helyesen beírni?


    Elvileg ez a szintaktikailag jó!

    Az a lényeg hogy az időintervallumokat szeretném összesíteni cégekre lebontva méghozzá úgy, hogy az eredményben az időintervallumot Gird ben megjeleníthető idő formátumban kapjam vissza, ne real típusként.


    Delphiben az intervallum mezőt állísd datetime tíusra a query-ben...
    Mutasd a teljes hozzászólást!
  • Igen azt sejtettem, hogy valami ilyesmi lesz a megoldás. Sőt gondolom a queryre jobb gomb fields editor és ott a fieldnek a DisplayFormat propertynek kellene megadni valamit. Pl.: 't' Csak így hibával elszáll. Azt mondja:

    SQL Error expression evaluation not supported Error Code: -833. expression evaluation not supported

    Így még az lenne a kérdésem, hogy a Queryben pontosan melyik propertyt kell átállítani és mire? (Zeos-t használok)
    Mutasd a teljes hozzászólást!
  • Sql 92 es szabvány alatt ez használható
    CAST(Datum1 - Datum2 as Date)
    Próbáld ki.
    Mutasd a teljes hozzászólást!
  • Sajnos a Zeos-hoz nem értek, de szerintem ez megoldja a gondodat! Field editorból töröld ki a mezőt, majd adj hozzá egy újat! A felviteli felületen a névnek add meg a mező nevét és a type valószínüleg egyből beállítódik real-re! Ezt rakd át datetime-ra és valószínüleg működni fog! Ja és a field type legyen data, mert ha jól tudom defaultként calculated lesz!
    Mutasd a teljes hozzászólást!
  • szemur verziójára:

    SELECT
    CO.NAME,
    CAST(SUM(CLOCK."END" - CLOCK.START) AS Date) AS INTERVALLUM
    FROM
    CLOCK
    INNER JOIN CO ON (CLOCK.ID_CO = CO.ID)
    GROUP BY
    CO.NAME

    azt mondja:
    Overflow occured during data type conversion.Conversion error from string "1.000023148000000 ".

    Ez mondjuk talán a SUM függvény miatt van, és mert dátumból a CAST tud numerikussá alakítani, numerikusból ahogy olvastam dátumot nem, így érthető is.


    cyberpunk esetében:
    ZQuery1: Type mismatch for field ’INTERVALLUM’, expecting: DateTime actual: Float.

    Viszont az irány nem rossz.
    Le is írom, hátha szüksége lesz rá valaha valakinek.
    Kalkulált mezőként átalakítottam dátummá:

    procedure TDM.qIntervallumCalcFields(DataSet: TDataSet);
    begin
    DM.qIntervallumIDO.Value:= DM.qIntervallumINTERVALLUM.Value - DateDelta;
    end;

    De itt jön a másik csavar a történetben. Az eredmény pl. 1 órás intervallumnál 0,041666666 ez pedig 1899-12-12 01:00:00 lesz mivel a 0 ennek a dátumnak felel meg. Mondom semmi probléma kivonom belőle a DateDelta constansot mert az ugye pont ez. Fasza az eredmény 0001-01-01 01:00:00.
    Na bumm ez se jó mert így a felhasználónak érthetetlen, igazából nekem ez kellene: 0000-00-00 01:00:00 ha viszont az előbb említett dátumból kivonok akár egy napot is IncDay(dátum, -1) akkor elszáll az egész, nem fér bele a DateTime típusba.

    Na mind1 tulajdonképpen már megoldottam a problémát úgy, hogy egyszerűen kiírom egy string típusú mezőbe úgy ahogy nekem tetszik, ez legalább működik bár iszonyat ronda megoldás.
    Mivel cyberpunk vezettett rá a megoldásra ott a pont.
    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