Tema: Re: MSSQL : Kaip gauti sumini laika pagal kintamojo busena?
Autorius: bala nemate
Data: 2010-03-22 06:55:41
On Mon, 22 Mar 2010 04:40:50 +0200, Laimis wrote:

> 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

aha. dekui labai. einu skaityti apie OVER ir Row_Number.

-- 
bn/mj
icq : 171288416
skype : bala.nemate
"The blues ain't about making yourself feel better.
it's about making other people feel worse."
					-- Bleeding Gums Murphy