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ę :)