Selezione di un intervallo di tempo

lunedì 23 aprile 2007 - 11.36

Pongo Profilo | Senior Member

Ciao,
volevo fare una query che mi estraesse tutti i dati presenti nel database entro un determinato intervallo di ore.

Il mio problema è che se selezione un determinato giorno ok, però se voglio un intervallo di giorni??

Per esempio tutti i dati registrati in una settimana entro le 12 e le 15.

Come potrei fare? Avevo provato ad usare una variabile giorno, come datetime, ma non riesco a legarla con l'ora.

Avete qualche idea??

lbenaglia Profilo | Guru

>volevo fare una query che mi estraesse tutti i dati presenti
>nel database entro un determinato intervallo di ore.

Ciao Pongo,

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

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

Pongo Profilo | Senior Member

Ciao Lorenzo

Uso SqlServer2000.

Le tabello come sempre sono oscene. Un riassunto è questo:

Data || Numero_Riga || Numero_Scontrino 12-1-07 10.25.30 1 1 12-1-07 10.25.35 2 1 12-1-07 12.25.30 1 2 12-1-07 14.25.33 1 3 12-1-07 14.25.30 2 3 13-1-07 13.25.30 1 1 13-1-07 13.25.30 2 1 13-1-07 16.25.30 1 2 14-1-07 17.25.30 1 3 14-1-07 17.25.32 2 3

Praticamente mi interesserebbe estrarre tutti quei datio che pur con una
data diversa hanno lìintervallo di tempo tre le 12.00 e le 15.00, per esempio.

lbenaglia Profilo | Guru

>Le tabello come sempre sono oscene.
Ma nessuno ti vieta di confezionare un esempietto come richesto, no?

>Praticamente mi interesserebbe estrarre tutti quei datio che
>pur con una
>data diversa hanno lìintervallo di tempo tre le 12.00 e le 15.00,
>per esempio.
Osserva il seguente esempio:

USE tempdb; CREATE TABLE dbo.Dati( Data datetime NOT NULL, Numero_Riga tinyint NOT NULL, Numero_Scontrino tinyint NOT NULL ); INSERT dbo.Dati VALUES('20070112 10:25:30', 1, 1); INSERT dbo.Dati VALUES('20070112 10:25:35', 2, 1); INSERT dbo.Dati VALUES('20070112 12:25:30', 1, 2); INSERT dbo.Dati VALUES('20070112 14:25:33', 1, 3); INSERT dbo.Dati VALUES('20070112 14:25:30', 2, 3); INSERT dbo.Dati VALUES('20070113 13:25:30', 1, 1); INSERT dbo.Dati VALUES('20070113 13:25:30', 2, 1); INSERT dbo.Dati VALUES('20070113 16:25:30', 1, 2); INSERT dbo.Dati VALUES('20070114 17:25:30', 1, 3); INSERT dbo.Dati VALUES('20070114 17:25:32', 2, 3); SELECT * FROM dbo.Dati WHERE CONVERT(char(8), Data, 108) BETWEEN '12:00' AND '15:00' /* Output: Data Numero_Riga Numero_Scontrino ----------------------- ----------- ---------------- 2007-01-12 12:25:30.000 1 2 2007-01-12 14:25:33.000 1 3 2007-01-12 14:25:30.000 2 3 2007-01-13 13:25:30.000 1 1 2007-01-13 13:25:30.000 2 1 (5 row(s) affected) */

Come vedi mi ritrovo costretto a castare la colonna Data a stringa specificando lo stile 108 (che restituisce l'informazione oraria relativa ai data type datetime e smalldatetime) nella clausola WHERE.
Questo comporta un cast per ogni riga della tabella, aumentando i tempi ed il carico di lavoro sul server.
Se le righe sono molte e le query che effettuano i filtri sulle ore sono frequenti, in SQL Server 2005 potresti aggiungere una colonna calcolata che esegue il cast e lo rende persistente nella tabella ad ogni INSERT|UPDATE:

ALTER TABLE dbo.Dati ADD Ora AS CONVERT(char(8), Data, 108) PERSISTED SELECT * FROM dbo.Dati WHERE Ora BETWEEN '12:00' AND '15:00'; /* Output: Data Numero_Riga Numero_Scontrino ----------------------- ----------- ---------------- 2007-01-12 12:25:30.000 1 2 2007-01-12 14:25:33.000 1 3 2007-01-12 14:25:30.000 2 3 2007-01-13 13:25:30.000 1 1 2007-01-13 13:25:30.000 2 1 (5 row(s) affected) */ DROP TABLE dbo.Dati;

In questo modo le query di selezione per fascia oraria saranno estremamente più efficienti (meglio ancora se definisci un indice clustered su tale colonna).

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

Pongo Profilo | Senior Member

Grazie Lorenzo, perfetto.

Era proprio il Convert la roba che mi mancava!

Le query non sono frequenti e comunque non posso aggiungere nulla al db, altrimenti al prossimo aggiornamento del programma mi sa che il mio capo mi viene a cercare!
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