2014-06-20 201 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