2014-06-20 229 views
0

我有一個搜索表單,允許您輸入任何想要的信息並對該數據執行搜索。TSQL搜索日期範圍

這裏是什麼形式的樣子:

enter image description here

我的目標是讓他們輸入開始日期和結束日期。但是,他們可以選擇只輸入一個或另一個。在這種情況下,我需要我的存儲過程正確處理它。

如果結束日期爲空,則結束日期將成爲今天的日期。如果開始日期是空的,我們可以做任何日期(例如,默認日期爲sq的默認日期,其中包括所有內容)

awardDate是正在搜索的字段,如果兩個日期都輸入了,那麼它需要是範圍between start and end

下面是我當前的存儲過程:

SELECT DISTINCT A.[awardID], 
    A.[awardDescription], 
    convert(varchar,cast(A.[awardValue] as money),1) as awardValue, 
    CONVERT (VARCHAR (10), A.[awardDate], 101) AS awardDate, 
    CONVERT (VARCHAR (10), A.[timestamp], 101) AS timestamp, 
    B.[FirstName] + ' ' + B.[LastName] as empName, 
    B.[ntid] AS empNTID, 
    C.[awardType] as awardTypeName, 
    D.[locationName], 
    E.[awardStatusName] 
FROM taxTracker AS A 
    INNER JOIN 
    empTable AS B 
    ON A.[employee] = B.[empID] 
    INNER JOIN 
    taxTrackerAwardTypes AS C 
    ON A.[awardType] = C.[awardTypeID] 
    INNER JOIN taxTrackerLocations as D 
    ON A.[awardLocation] = D.[id] 
    INNER JOIN taxTrackerStatuses as E 
    ON A.[awardStatus] = E.[awardStatusID] 
WHERE ((A.[employee] IN (SELECT ParamValues.x2.value('empID[1]', 'VARCHAR(60)') 
      FROM @employees.nodes('/employees/employee') AS ParamValues(x2))) 
    OR (ISNULL(@awardType, '') <> '' 
     AND A.[awardType] LIKE '%' + @awardType + '%') 
    OR (ISNULL(@awardStatus, '') <> '' 
     AND A.[awardStatus] LIKE '%' + @awardStatus + '%')) 
FOR XML PATH ('details'), TYPE, ELEMENTS, ROOT ('root'); 

回答

1
where (awarddate >= @startdate or @stardate is null) 
and (awarddate <= isnull(@enddate, getdate()) 
+0

似乎一切正在工作,除非我只在開始日期之前就像一個月前的記錄。它應該從那天開始,然後得到任何東西直到當前日期。例如:記錄是2014年2月1日,我在2014年1月1日進行了搜索。它應該在1/1/2014和今天的日期之間得到任何東西 – SBB

+0

你有沒有試過用'20140101','20140102'等ISO格式寫日期?我很快測試了這個[demo](http://sqlfiddle.com/#!6/b29e8),看起來沒問題。 –

+0

但是我得到了這個錯誤,但是沒有一個日期字段是INT - '操作數類型衝突:int與日期不兼容' – SBB

0
Awarddate between isnull (@startdate, '19000101') and isnull (@enddate, getdate()) 
+0

了'GETDATE()'技巧可能在這個例子中工作,但它不會在案件未來的工作附表日期和硬編碼'19000101'在某些情況下也不是一種選擇。 – Horaciux

+0

在這種情況下,您可以使用未來日程安排日期的最大值 – WarAnt

+0

請參閱上面用戶TI的回答,這是一般性答案。歡迎來到SO。 – Horaciux