Wydajne wyszukiwanie danych z przedziału dat

0

Mam w bazie tabelę z zapisanymi pomiarami. Są w niej zapisane czas (smalldatetime, ale potrzebna jest dokładność do minuty), wartość pomiaru oraz id użytkownika, który dokonał pomiaru.
Tworzę procedurę wyświetlającą pomiary dla konkretnego użytkownika w określonym przedziale czasu. Przedział czasu podawany jest z dokładnością do dnia. I chodzi o to, żeby wyszukało wszystkie pomiary od początku pierwszego dnia do końca dnia ostatniego. Ponadto, gdy poda się dwukrotnie ten sam dzień powinno wyświetlić wszystkie pomiary z tego jednego dnia. Cały problem leży więc w konwersjach dat z dzień na dzień + czas.
Rozwiązałem to w taki sposób:

ALTER PROCEDURE [dbo].[WyswietlPomiary]
    @id_uzytkownika            int,
    @data_poczatkowa        smalldatetime,
    @data_koncowa            smalldatetime
AS
BEGIN
    --konwersje w celu przeszukiwania od początku dziena początkowego do końca dziena końcowego
    DECLARE @dzien char(10)
    SET @dzien = CONVERT(char(10), @data_poczatkowa, 120)
    SET @data_poczatkowa = @dzien + ' 00:00:00'
    SET @dzien = CONVERT(char(10), @data_koncowa, 120)
    SET @data_koncowa = @dzien + ' 23:59:59'

    SELECT czas, wartosc
    FROM Pomiary
    WHERE id_uzytkownika = @id_uzytkownika AND   
    czas BETWEEN @data_poczatkowa AND @data_koncowa
END

Działa dobrze, ale to rozwiązanie wydaje mi się mało wydajne i strasznie przekombinowane. Przeczytałem ten artykuł: http://www.codeguru.pl/article-670.aspx
I próbowałem przerobić swoją procedurę w podany tam sposób:

ALTER PROCEDURE [dbo].[WyswietlPomiary]
    @id_uzytkownika            int,
    @data_poczatkowa        smalldatetime,
    @data_koncowa            smalldatetime
AS
BEGIN
    SELECT czas, wartosc
    FROM Pomiary
    WHERE id_uzytkownika = @id_uzytkownika AND   
    czas >= CAST(FLOOR(CAST(@data_poczatkowa AS FLOAT))AS DATETIME) AND
    czas < CAST(CEILING(CAST(@data_koncowa AS FLOAT))AS DATETIME)
END

Ale coś mi nie wyszło i nie działa tak jak chciałem - nie wyszukuje prawidłowo :(
Wiecie może, co zrobiłem źle?
A może jest jakiś inny, lepszy sposób na wydajne rozwiązanie mojego problemu.
Z góry dziękuję :)

0

co to znaczy, że wydaje Ci się, że coś jest mało wydajne? podaj powody; co najwyżej z tych czterech set-ów możesz zrobić dwa, jednak nie będzie to mieć praktycznie żadnego wpływu na wydajność. to co robisz w drugim zapytaniu to praktycznie to samo, co robisz w pierwszym, tylko bardziej zakombinowane.
masz założony indeks na pole czas? zobacz w planie wykonania, czy jest używany. zwróć uwagę, czy wszędzie masz index seek (a nie index scan czy - o zgrozo - table scan). to jest to, co ma największy wpływ na czas wykonania zapytania, a nie duperelki związane z obcięciem końcówki daty (wykonywane RAZ na całe zapytanie).

1 użytkowników online, w tym zalogowanych: 0, gości: 1