The
smalldatetime[
^] fields contain a date that is combined with a time of day. The time is based on a 24-hour day, with seconds always zero (:00) and without fractional seconds. See example and its output.
DECLARE @mydate smalldatetime
SET DATEFORMAT ymd;
SET @mydate = GETDATE()
SELECT @mydate as [CurrentDate]
Output:
[CurrentDate]
-------------------
2012-10-02 21:01:00
To get only date part, use
CONVERT or CAST[
^] function.
SELECT CONVERT(NVARCHAR(10), @mydate,121) as [CurrentDate]
Output:
[CurrentDate]
-------------------
2012-10-02
Finally... to correctly join tables on date field, you need to "reject" the time part... But after that operation i'm not sure that your data will be unique.
SELECT CONVERT(SMALLDATETIME, CONVERT(NVARCHAR(10), @mydate,121)) as [CurrentDate]
Output:
[CurrentDate]
-------------------
2012-10-02 00:00:00
I suggest you to create temporary table, load the corrected data into this table and select...
SET DATEFORMAT mdy;
CREATE TABLE #tt (TotalVol INT, MyDate SMALLDATETIME, ID INT)
INSERT INTO #tt (TotalVol, MyDate, ID)
SELECT [BOSS] AS [TotaVol], CONVERT(SMALLDATETIME, CONVERT(NVARCHAR(10),[Date],121) AS [MyDate], DisplayAsID As [ID]
FROM Keyed_Data AS KD LEFT JOIN Stored_Vol_Counts AS SVC ON CONVERT(SMALLDATETIME, CONVERT(NVARCHAR(10),KD.[Date],121)) = CONVERT(SMALLDATETIME, CONVERT(NVARCHAR(10),SVC.[Date],121))
DECLARE @dFrom SMALLDATETIME
DECLARE @dTo SMALLDATETIME
SET @dFrom = '09/09/12'
SET @dTo = '09/15/12'
SELECT *
FROM #tt
WHERE (([MyDate] BETWEEN @dFrom AND @dTo) AND (ID = 35);
SELECT SUM([TotalVol]) AS TotalVolInRange
FROM #tt
WHERE (([MyDate] BETWEEN @dFrom AND @dTo) AND (ID = 35);
DROP TABLE #tt