Mancata trasmissione dati

mercoledì 21 agosto 2013 - 08.56
Tag Elenco Tags  VB.NET  |  .NET 2.0  |  Visual Studio 2005  |  SQL Server 2008  |  SQL Server 2005  |  Oracle 11g  |  Oracle 10g

franco.geko Profilo | Junior Member

Ciao a tutti,
ho una tabella in oracle nella quale vengono inserite ogni ora le rilevazioni di alcune sonde temperatura.
Queste rilevazioni hanno intervallo di 10 minuti.

Es:
2013-08-20 08:00:00
2013-08-20 08:10:00
2013-08-20 08:20:00
2013-08-20 08:30:00
2013-08-20 08:40:00
2013-08-20 08:50:00
2013-08-20 09:00:00
...

Dovrei verificare ed evidenziare se in un intervallo di date c'è stato un 'buco' di trasmissione.

Nell'esempio seguente mancano le rilevazioni dalle 09:30 alle 10:00

2013-08-20 08:00:00
2013-08-20 08:10:00
2013-08-20 08:20:00
2013-08-20 08:30:00
2013-08-20 08:40:00
2013-08-20 08:50:00
2013-08-20 09:00:00
2013-08-20 09:10:00
2013-08-20 09:20:00
2013-08-20 09:30:00
2013-08-20 10:00:00
2013-08-20 10:10:00
2013-08-20 10:20:00
2013-08-20 10:30:00
....

E' possibile farlo con il solo SQL senza dover per forza controllarlo da programma?

grazie dell'attenzione
Franco
Assaggiata l'acqua, conosciuta la sorgente

Dev01 Profilo | Newbie

Ciao.
Con qualche riga di codice potresti rendere la tua soluzione più robusta.
Tieni presente che se il server risente di questi "problemi di trasmissione" (peraltro bisognerebbe identificarne bene la causa) probabilmente ti converrà adottare un'architettura differente (con dati resi persistenti a livello fisico e non solo di memoria) per la tua applicazione.

Ovviamente le mie sono solo possibili soluzioni, perfettibili e perfettamente opinabili:

#1 (La più breve)
Inserisci le stringhe contenenti i valori in un dictionary che contenga anche la chiave primaria associata al valore prelevando l'ultimo utilizzato e aumentandolo di 1.
Il programma scrive nel database ogni tot di tempo utilizzando una coda di tipo FIFO e, dopo aver controllato la presenza delle chiavi cancella la coda e riparte da zero.
In caso di errore (mancato riscontro) il programma tenta il reinserimento dei valori mancanti prima di cancellare i dati dalla coda.
Tanto per la lettura puoi utilizzare un tranquillo ORDER BY...

#2 (La più impegnativa)
Poiché la suddetta operazione non ti garantisce in caso di crash dell'applicazione potresti scrivere in valori in aggiunta ad un file di log e andarti a leggere quello prima di effettuare le operazioni suesposte.
Al termine delle operazioni (buon fine) cancelli anche il file o ne crei uno nuovo (o ne crei uno al giorno per tenere un backup di sicurezza).
Tanto hai dieci minuti di tempo fra un rilevamento/scrittura e un altro.



01000100 01100101 01110110 00101101 00110000 00110001

franco.geko Profilo | Junior Member

Grazie Dev1 per la risposta.
Purtroppo io non ho il controllo sull'inserimento dati: viene effettuato da programmi di terze parti.
Io posso solo effettuare dei controlli sui dati inseriti e cioè le date di rilevazione.

Le difficoltà del sistema è che si tratta di dati inviati via gprs da apparecchi di telemetria collegati a celle frigorifere installati su furgoni.
Tali dati vengono inviati al server di telemetria il quale, ogni ora, li inserisce nel "mio" sistema.

Da qui entro in gioco io che dovrei controllare eventuali 'buchi' di date per i controlli del caso.

Spero di essermi spiegato :)

Grazie
Franco
Assaggiata l'acqua, conosciuta la sorgente

renarig Profilo | Expert

>E' possibile farlo con il solo SQL senza dover per forza controllarlo da programma?

Si,
- Metti in ordine di data
- Fai la differenza fra il record superiore e il record attuale
- Estrai i valori superiori a 10 minuti ( magari gli dai una tolleranza )


Adesso devo andare,
Magari questa sera ti scrivo un esempio di query ( solo SQL ) che faccia queste cose

.

franco.geko Profilo | Junior Member

Grazie mille!
mi faresti un favorone :D

ciao
Franco
Assaggiata l'acqua, conosciuta la sorgente

franco.geko Profilo | Junior Member

Forse ho risolto in questo modo:

Select ID,DataAtt,DataPrec,(DataAtt - DataPrec)*24*60 DiffMinuti,Rank From ( Select T.ID, T.Data DataAtt, (Select MAX(T1.Data) From Tabella T1 WHERE T.ID = T1.ID AND T.Data > T1.Data) DataPrec, Rank() over (partition by T.ID Order by T.Data DESC) Rank FROM Tabella T ) Where Rank < 60 Order by ID,DataAtt DESC

In pratica prendo per ogni id il MAX della data con data dalla seconda tabella minore della prima (in pratica l'ultima data prima di quella attuale).
Il Rank e il partition by li uso per non prendere TUTTI i record ma solo le ultime 60 letture per ogni ID (10 ore).

Funziona.

Se c'è un metodo migliore e più efficiente, ben venga!!! :D

Grazie
Franco
Assaggiata l'acqua, conosciuta la sorgente

renarig Profilo | Expert

>... In pratica prendo per ogni id il MAX della data con data dalla
>seconda tabella minore della prima .....

>... Se c'è un metodo migliore e più efficiente, ben venga!!!

Direi che è la strada giusta ( io pensavo a quella )

.
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5