>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