Intervallo sull'orario

mercoledì 19 settembre 2007 - 09.31

PEPE Profilo | Senior Member

Salve a tutti,
vorrei cercare di capire in che modo effettuare un'operazione.

allora ho una tabella con un campo data che mi riporta dei dati ogni minuto, ma potrei avere anche dei buchi. Comunque supponiamo che ho una tabella con dei dati al minuto.
dovrei poter prendere solo un set di informazioni del tipo tutti i dati dalle 13:00 alle 15:00 e per quello non c'e' problema (il grande loranzo mi ha risposto in un altro thread :D:D:D).
Quello che vorrei capire è se tramite la query è possibile ad esempio prendere i dati dalle 13:00 alle 15:00 con step variabile del tipo ogni 5 minuti (risultato: 13.00, 13:05, 13:10 ecc ecc fino alle 15), oppure ogni 3 (13.00, 13.03, 13.06) ecc ecc.

Senno una volta che prendo i dati mi scorro le righe dentro la tatatable e mi elimino il "surplus" :D:D:D.

Grazie 1000,
Luca.

lbenaglia Profilo | Guru

>Quello che vorrei capire è se tramite la query è possibile ad
>esempio prendere i dati dalle 13:00 alle 15:00 con step variabile
>del tipo ogni 5 minuti (risultato: 13.00, 13:05, 13:10 ecc ecc
>fino alle 15), oppure ogni 3 (13.00, 13.03, 13.06) ecc ecc.
>
>Senno una volta che prendo i dati mi scorro le righe dentro la
>tatatable e mi elimino il "surplus" :D:D:D.

Ciao Luca,

che DBMS utilizzi?
Puoi postare un esempio completo con la struttura della tabella (CREATE TABLE), alcune righe di prova (INSERT INTO) ed il result set che vorresti ottenere?

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

PEPE Profilo | Senior Member

Ciao Lorenzo,
utilizzo il codice con il quale mi hai risposto in un post precedente :D.

Utilizzo sql server 2000 ma spero sia uguale anche per il 2005 :P

USE tempdb;

CREATE TABLE dbo.myData( DataID int NOT NULL IDENTITY PRIMARY KEY, Date datetime NOT NULL ); INSERT dbo.myData VALUES('20070601 10:00:00'); INSERT dbo.myData VALUES('20070601 10:01:00'); INSERT dbo.myData VALUES('20070601 10:02:00'); INSERT dbo.myData VALUES('20070601 10:03:00'); INSERT dbo.myData VALUES('20070601 10:04:00'); INSERT dbo.myData VALUES('20070601 10:05:00'); INSERT dbo.myData VALUES('20070601 10:06:00'); INSERT dbo.myData VALUES('20070601 10:07:00'); INSERT dbo.myData VALUES('20070601 10:08:00'); INSERT dbo.myData VALUES('20070601 10:09:00'); INSERT dbo.myData VALUES('20070601 10:10:00'); INSERT dbo.myData VALUES('20070601 10:11:00'); INSERT dbo.myData VALUES('20070601 10:12:00'); INSERT dbo.myData VALUES('20070601 10:13:00'); INSERT dbo.myData VALUES('20070601 10:14:00'); INSERT dbo.myData VALUES('20070601 10:15:00'); INSERT dbo.myData VALUES('20070601 10:16:00'); INSERT dbo.myData VALUES('20070601 10:17:00'); INSERT dbo.myData VALUES('20070602 10:00:00'); INSERT dbo.myData VALUES('20070602 10:01:00'); INSERT dbo.myData VALUES('20070602 10:02:00'); INSERT dbo.myData VALUES('20070602 10:03:00'); INSERT dbo.myData VALUES('20070602 10:04:00'); INSERT dbo.myData VALUES('20070602 10:05:00'); INSERT dbo.myData VALUES('20070602 10:06:00'); INSERT dbo.myData VALUES('20070602 10:07:00'); INSERT dbo.myData VALUES('20070602 10:08:00'); INSERT dbo.myData VALUES('20070602 10:09:00'); INSERT dbo.myData VALUES('20070602 10:10:00'); INSERT dbo.myData VALUES('20070602 10:11:00'); INSERT dbo.myData VALUES('20070602 10:12:00'); INSERT dbo.myData VALUES('20070602 10:13:00'); INSERT dbo.myData VALUES('20070602 10:14:00'); INSERT dbo.myData VALUES('20070602 10:15:00'); INSERT dbo.myData VALUES('20070602 10:16:00'); INSERT dbo.myData VALUES('20070602 10:17:00');

Allora supponiamo di voler prendere tutti irecord che vanno dal 1-6-07 al 2-6-07 dalle 10:01 alle 10:13 non ci sono poblemi, utilizzo il
CAST(CONVERT(varchar, Date, 114) AS datetime) BETWEEN '10:01' AND '10:13:59.997' nella query di selezione

Se io pero voglio gli stessi dati ma utilizzando uno "step" del tipo come sopra ma con step di 2 minuti, dovrei ottenere

2007-06-01 10:01:00.000 2007-06-01 10:03:00.000 2007-06-01 10:05:00.000 2007-06-01 10:07:00.000 2007-06-01 10:09:00.000 2007-06-01 10:11:00.000 2007-06-01 10:13:00.000 2007-06-02 10:01:00.000 2007-06-02 10:03:00.000 2007-06-02 10:05:00.000 2007-06-02 10:07:00.000 2007-06-02 10:09:00.000 2007-06-02 10:11:00.000 2007-06-02 10:13:00.000

Potrei voler cambiare step e mettere ad esempio 4 minuti e quindi ottenere

2007-06-01 10:01:00.000 2007-06-01 10:05:00.000 2007-06-01 10:09:00.000 2007-06-01 10:07:00.000 2007-06-01 10:09:00.000 2007-06-01 10:13:00.000 2007-06-02 10:01:00.000 2007-06-02 10:05:00.000 2007-06-02 10:09:00.000 2007-06-02 10:07:00.000 2007-06-02 10:09:00.000 2007-06-02 10:13:00.000

Oppure 5 minuti

2007-06-01 10:01:00.000 2007-06-01 10:06:00.000 2007-06-01 10:11:00.000 2007-06-02 10:01:00.000 2007-06-02 10:06:00.000 2007-06-02 10:11:00.000

lbenaglia Profilo | Guru

>Utilizzo sql server 2000 ma spero sia uguale anche per il 2005
>:P
Ti propongo una soluzione per SQL Server 2005 basata su una Common Table Expression ricorsiva:

USE tempdb; CREATE TABLE dbo.myData( DataID int NOT NULL IDENTITY PRIMARY KEY, Date datetime NOT NULL ); INSERT dbo.myData VALUES('20070601 10:00:00'); INSERT dbo.myData VALUES('20070601 10:01:00'); INSERT dbo.myData VALUES('20070601 10:02:00'); INSERT dbo.myData VALUES('20070601 10:03:00'); INSERT dbo.myData VALUES('20070601 10:04:00'); INSERT dbo.myData VALUES('20070601 10:05:00'); INSERT dbo.myData VALUES('20070601 10:06:00'); INSERT dbo.myData VALUES('20070601 10:07:00'); INSERT dbo.myData VALUES('20070601 10:08:00'); INSERT dbo.myData VALUES('20070601 10:09:00'); INSERT dbo.myData VALUES('20070601 10:10:00'); INSERT dbo.myData VALUES('20070601 10:11:00'); INSERT dbo.myData VALUES('20070601 10:12:00'); INSERT dbo.myData VALUES('20070601 10:13:00'); INSERT dbo.myData VALUES('20070601 10:14:00'); INSERT dbo.myData VALUES('20070601 10:15:00'); INSERT dbo.myData VALUES('20070601 10:16:00'); INSERT dbo.myData VALUES('20070601 10:17:00'); INSERT dbo.myData VALUES('20070602 10:00:00'); INSERT dbo.myData VALUES('20070602 10:01:00'); INSERT dbo.myData VALUES('20070602 10:02:00'); INSERT dbo.myData VALUES('20070602 10:03:00'); INSERT dbo.myData VALUES('20070602 10:04:00'); INSERT dbo.myData VALUES('20070602 10:05:00'); INSERT dbo.myData VALUES('20070602 10:06:00'); INSERT dbo.myData VALUES('20070602 10:07:00'); INSERT dbo.myData VALUES('20070602 10:08:00'); INSERT dbo.myData VALUES('20070602 10:09:00'); INSERT dbo.myData VALUES('20070602 10:10:00'); INSERT dbo.myData VALUES('20070602 10:11:00'); INSERT dbo.myData VALUES('20070602 10:12:00'); INSERT dbo.myData VALUES('20070602 10:13:00'); INSERT dbo.myData VALUES('20070602 10:14:00'); INSERT dbo.myData VALUES('20070602 10:15:00'); INSERT dbo.myData VALUES('20070602 10:16:00'); INSERT dbo.myData VALUES('20070602 10:17:00'); GO CREATE FUNCTION dbo.udf_GetInterval( @Interval smallint = 1 ) RETURNS TABLE AS RETURN ( WITH CTE_GetInterval AS ( /* Anchor Member */ SELECT * FROM dbo.myData WHERE DataID = 1 UNION ALL /* Recursive Member */ SELECT D.* FROM dbo.myData AS D JOIN CTE_GetInterval AS CTE ON D.Date = DATEADD(minute, @Interval, CTE.Date) ) SELECT * FROM CTE_GetInterval ); GO SELECT * FROM dbo.udf_GetInterval(1); /* Output: DataID Date ----------- ----------------------- 1 2007-06-01 10:00:00.000 2 2007-06-01 10:01:00.000 3 2007-06-01 10:02:00.000 4 2007-06-01 10:03:00.000 5 2007-06-01 10:04:00.000 6 2007-06-01 10:05:00.000 7 2007-06-01 10:06:00.000 8 2007-06-01 10:07:00.000 9 2007-06-01 10:08:00.000 10 2007-06-01 10:09:00.000 11 2007-06-01 10:10:00.000 12 2007-06-01 10:11:00.000 13 2007-06-01 10:12:00.000 14 2007-06-01 10:13:00.000 15 2007-06-01 10:14:00.000 16 2007-06-01 10:15:00.000 17 2007-06-01 10:16:00.000 18 2007-06-01 10:17:00.000 (18 row(s) affected) */ SELECT * FROM dbo.udf_GetInterval(2); /* Output: DataID Date ----------- ----------------------- 1 2007-06-01 10:00:00.000 3 2007-06-01 10:02:00.000 5 2007-06-01 10:04:00.000 7 2007-06-01 10:06:00.000 9 2007-06-01 10:08:00.000 11 2007-06-01 10:10:00.000 13 2007-06-01 10:12:00.000 15 2007-06-01 10:14:00.000 17 2007-06-01 10:16:00.000 (9 row(s) affected) */ SELECT * FROM dbo.udf_GetInterval(3); /* Output: DataID Date ----------- ----------------------- 1 2007-06-01 10:00:00.000 4 2007-06-01 10:03:00.000 7 2007-06-01 10:06:00.000 10 2007-06-01 10:09:00.000 13 2007-06-01 10:12:00.000 16 2007-06-01 10:15:00.000 (6 row(s) affected) */ SELECT * FROM dbo.udf_GetInterval(5); /* Output: DataID Date ----------- ----------------------- 1 2007-06-01 10:00:00.000 6 2007-06-01 10:05:00.000 11 2007-06-01 10:10:00.000 16 2007-06-01 10:15:00.000 (4 row(s) affected) */ SELECT * FROM dbo.udf_GetInterval(17); /* Output: DataID Date ----------- ----------------------- 1 2007-06-01 10:00:00.000 18 2007-06-01 10:17:00.000 (2 row(s) affected) */ SELECT * FROM dbo.udf_GetInterval(20); /* Output: DataID Date ----------- ----------------------- 1 2007-06-01 10:00:00.000 (1 row(s) affected) */ DROP FUNCTION dbo.udf_GetInterval; DROP TABLE dbo.myData;

Con SQL Server 2000 potresti definire delle funzioni ricorsive ma il problema non è banale, oppure utilizzare un cursore per ciclare il resultset considerando solo le righe che soddisfano l'intervallo.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

PEPE Profilo | Senior Member

Grazie 1000 Lorenzo :D.
Non ho mai utilizzato le funzioni fin ora, mi sono semplicemente limitato a fare query di selezione abbastanza standard.

Comunque, se vuoi puoi rispondermi anche in pvt, c'e' un buon libro, anche abbastanza semplice, che spiega tutte queste cose?

Mentre per asp.net ho un sacco di libri ed ho studiato li per sql server non ho manco un libro e le query me le fate sempre voi :P.

Grazie ancora,
Luca

lbenaglia Profilo | Guru

>Comunque, se vuoi puoi rispondermi anche in pvt, c'e' un buon
>libro, anche abbastanza semplice, che spiega tutte queste cose?
Il libro migliore del mondo è gratis ed è costituito dai Books Online, ovvero la documentazione di SQL Server.
Mi rendo conto però che non basterebbe una vita per leggerlo dall'inizio alla fine (e avrebbe poco senso farlo), così mi sento di suggerirti 2 libri di Itzik:
http://www.sql.co.il/books/insidetsql2005/

>Grazie ancora,
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org
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-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5