IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
Petan
Člen
Avatar
Odpovídá na c.bohumil
Petan:1.3.2022 18:15

No teda jestli to chapu/nechapu pak by melo stacit toto

from (SELECT DATEADD(minute,45,Datum) as Datum,kw FROM [dbo].[Pomocná_Tab_Datum_3]) X

nahradit timto

from (SELECT DATEADD(minute,-15,Datum) as Datum,kw FROM [dbo].[Pomocná_Tab_Datum_3]) X
 
Odpovědět
1.3.2022 18:15
Avatar
c.bohumil
Člen
Avatar
c.bohumil:5.4.2022 5:02

Ahoj kluci.
Mám tu další oříšek, teda aspoň pro mě..
Dotaz nakonec díky vám používám tento

SELECT
CAST(Datum as date) as Datum,
DATEPART(hour,Datum) as Hodina,
CAST(sum(kW)/4.0/1000 AS decimal(9,5) ) as mWh
from (SELECT DATEADD(minute,45,Datum) as Datum,kw FROM [dbo].[Pomocná_Tab_Datum_3]) X
group by
CAST(Datum as date),
DATEPART(hour,Datum)
ORDER BY
1 ASC, 2 ASC OFFSET 0 ROWS
GO

Přesný výsledek vychází na 5 desetinných míst a pro vyhodnocení potřebuji jen 3 desetinná místa.
Ale....nemůžu zaokrouhlovat pro součet celého měsíce, protože by se mi to rozcházelo, respektive nesouhlasilo s daty které dostávám od ČEZu pro vyhodnocení. Oni ubírají poslední 2 desetinná místa a přičítají je do další hodiny. Mají napsaný script.
Nějaký tip jak to v MSSql udělat?
Děkuji

Editováno 5.4.2022 5:03
 
Nahoru Odpovědět
5.4.2022 5:02
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:5.4.2022 9:54

Obavam se, ze tohle jednoduse udelat nepujde. Asi to bude treba obalit dalsim selectem.
Pocitejme s tim, ze tabulka vychazi dobre, i soucty. Takze, ta je ok, jen se nejaka cisla musi trochu upravit.
A take muze nastat, ze dany radek, kam chces pricist/odecist, nemusi existovat.

  • zkopiruj a, b, c, value
  • odecti (odrizni) od value posledni 2 deset. mista value=floor(va­lue*1000)/1000
  • pricti k value mista z predchozi hodiny value = value + X, (select value from ... where hodina-1) = Y, X = y*1000 - floor(Y*1000)

https://docs.microsoft.com/…transact-sql?…

SELECT
    FLOOR(123.45), -- 123
    FLOOR(-123.45), -- -124 -- podle mne, toto je chyba, spravne by to melo dat -123, ne? ale to nebudes stejne potrebovat
    FLOOR($123.45); -- 123.0000 --- ten dolar nevim, co je

floor odrezava desetinou carku
A = 34.53485
B = 53.67832
C = floor(A*1000)/1000 = floor(34534.85)/1000 = 34534/1000 = 34.534
D = (B*1000 - floor(B*1000))/1000
    = (53678.32 - floor(53678.32))/1000
    = (53678.32 - 53678)/1000 = 0.32/1000
    = 0.00032
E = C + D = 34.534 + 0.00032

Ale, ted premyslim, ze to mozna ma byt jinak.

  • potrebujes odecist z aktualni hodiny vse za mistem 4
  • toto pricist na nasledujici hodinu (kde uz nejaka mista mas)
  • a v dalsim kroku pro tu upravenou dalsi hodinu udelat totez
  • s tim, ze u te prvni to budes mit chybne, pokud neznas, kolik tam pricitaji a tim padem i vsechny ostatni :)
B = 53.67832 -- aktualni
C = 98.12345 -- nasledujici
D = (B*1000 - floor(B*1000))/1000
    = (53678.32 - floor(53678.32))/1000
    = (53678.32 - 53678)/1000
    = 0.32/1000
    = 0.00032
new B = B - D
new C = C + D
---
B = 98.12345 + 0.00032 -- aktualni (new C)
C = 22.75544 -- nasledujici
D = (B*1000 - floor(B*1000))/1000 = ... 0.00077
new B = B - D
new C = C + D
Editováno 5.4.2022 9:55
 
Nahoru Odpovědět
5.4.2022 9:54
Avatar
c.bohumil
Člen
Avatar
Odpovídá na Peter Mlich
c.bohumil:6.4.2022 16:02

Potřebuji vzít poslední dvě čísla, tak aby zbylo číslo s tisícinou. Tato dvě odebraná čísla přičíst k následující hodině a v této hodině totéž, atd.. Teoreticky součet stále zůstane a vezme ty dvě poslední čísla už sečtená z předešlého součtu..
Tvl, to je zase úkol... 😁

 
Nahoru Odpovědět
6.4.2022 16:02
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 4 zpráv z 54.