Tema: Re: MSSQL : Kaip gauti sumini laika pagal kintamojo busena?
Autorius: Laimis
Data: 2010-03-22 04:40:53
bala nemate rašė:

> turiu lenta, kurioje fiksuojama, kada pasikeite yra irengimo busena
> (1-dirba, 0-stovi) ir laiko stampas. reikia susumuoti atidirbta laika (jei
> 1 atsistojo 12:12, o 0 - 12:20, skiasi pradirbta 8 minutes ir t.t.). galit
> gal ant kelio uzvesti, nuo ko pradeti aiskintis?
>
> misliju, uzklausoje reikia koki cikla prasukti ir persidelioti busenas is
> eiluciu i stulpus ir tada issirankioti datos skirtuma...(be ciklo turbut
> niekaip?)

Na kodėl gi niekaip, gana paprastai:

SELECT SUM(DATEDIFF(second, s.ts, e.ts))

FROM
	(SELECT ts, ROW_NUMBER() OVER(ORDER BY ts) AS rn FROM
	 dbo.tdata WHERE status = 1) s

INNER JOIN

	(SELECT ts, ROW_NUMBER() OVER(ORDER BY ts) AS rn FROM
  	dbo.tdata WHERE status = 0) e

ON s.rn = e.rn


(lentelė 'tdata': 'status' -- būklė (0/1), ts -- laiko štampas)

Ciklas galėtų patikrinti ar visi laiko momentai yra teisingi (jų 
netrūksta, jie nuoseklūs), nors jei duomenų teisingumą garantuoja kitas 
šaltinis, tai patikra galėtų būti nebent tik tokia:

SELECT ts.cnt - te.cnt FROM
(SELECT COUNT(ts) AS cnt FROM tdata WHERE status = 0) te,
(SELECT COUNT(ts) AS cnt FROM tdata WHERE status = 1) ts