2014-06-20 1 views
0

원하는 정보를 입력하고 해당 데이터를 검색 할 수있는 검색 양식이 있습니다. 여기TSQL 검색 기간

양식과 같은 모습입니다 :

enter image description here

내 목표는 그들이 시작 및 종료 날짜를 입력 할 수 있도록하는 것입니다. 그러나, 그들은 단지 하나 또는 다른 것을 입력하기로 선택할 수 있습니다. 이 경우 올바르게 처리하려면 저장 프로 시저가 필요합니다.

끝 날짜가 비어 있으면 끝 날짜가 오늘 날짜로 바뀝니다. 시작 날짜가 비어 있으면 모든 날짜를 포함 할 수 있습니다 (예 : 모든 날짜를 포함하는 기본 날짜).

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

레코드 시작 1 달 전에 시작 날짜 만 넣을 때를 제외하고 모든 것이 작동하는 것처럼 보입니다. 그 날짜에 시작해서 현재 날짜까지 아무 것도 얻지 못합니다. 예 : 2014 년 2 월 1 일의 레코드가 있으며 2014 년 1 월 1 일 내 검색에 사용됩니다. 2014 년 1 월 1 일과 오늘 날짜 사이에 무엇이든 가져와야합니다. – SBB

+0

날짜를 '20140101','20140102'와 같은 ISO 형식으로 작성하려 했습니까? 나는이 [데모] (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