2011-07-05 4 views
6

그래서 나는 테이블 아래에 제시 한SQL은 - 현재 날짜/시간 이후 기록을 선택

Date  Time  Field3  Field4 - etc. 
-------------------------------------------------- 
05/07/11 17:45  blah   blah 
05/07/11 19:45  blah   blah 
08/07/11 17:30 
08/07/11 19:00 
09/07/11 19:00 

내 그래서 문이 모든 일 사이이다 나는 현재 아래에 하나의 규칙이

오늘 (그래서 그것은 3/05/07/14 같은 날짜까지 05/07/11 일 것입니다).

또 다른 규칙을 WHERE 문 아래에 추가하여 현재 시간의 2 시간 전 (현재 날짜가 테이블의 날짜와 같은 경우) 만 표시하도록하고 싶습니다.

그래서 19시에서 05/07/11에 그것을 표시해야합니다 :

Date  Time  Field3  Field4 - etc. 
-------------------------------------------------- 
05/07/11 17:45  blah   blah 
05/07/11 19:45  blah   blah 
08/07/11 17:30 
08/07/11 19:00 
09/07/11 19:00 

을 같은 날에 21시 46분에, 지금 표시해야합니다 :

Date  Time  Field3  Field4 - etc. 
-------------------------------------------------- 
08/07/11 17:30 
08/07/11 19:00 
09/07/11 19:00 

어떻게 것 내 SQL에서이 일을합니까? 나는 그 때 또는 그 때 계산서, 그러나 나가 그것을 일할 수있을 때 havent 일 필요가있을 것이라는 점을 생각하고있다?

또한 날짜는 VB.Net 내에서 생성되므로 시간도 마찬가지입니다. 현재 SQL (및 작업) 코드는 다음과 같습니다

SELECT m.MatchID Manage, m.Date, m.Time, t.TeamCode "Home", b.TeamCode "Away", 
g.GroundName "Ground", (SUBSTRING(u.GivenName,1,1) + '. ' + RTRIM(u.Surname)) AS Referee, 
(SUBSTRING(v.GivenName,1,1) + '. ' + RTRIM(v.Surname)) AS "Assistant 1", 
(SUBSTRING(w.GivenName,1,1) + '. ' + RTRIM(w.Surname)) AS "Assistant 2", 
a.FOfficialID, a.AssessorID, a.RefereeAID, a.AReferee1AID, a.AReferee2AID, 
a.FOfficialAID, a.AssessorAID, 'Details' "Details", t.AgeGroupID, r.WetWeatherID 

FROM Match m 
LEFT OUTER JOIN Appointment a ON m.MatchID=a.MatchID 
LEFT OUTER JOIN WetWeather r ON r.MatchID=m.MatchID 
INNER JOIN Team t ON m.HomeTeamID=t.TeamID 
INNER JOIN Team b ON m.AwayTeamID=b.TeamID 
INNER JOIN Ground g ON g.GroundID=m.GroundID 
LEFT OUTER JOIN Users u ON u.UserID=a.RefereeID 
LEFT OUTER JOIN Users v on v.UserID=a.AReferee1ID 
LEFT OUTER JOIN Users w on w.UserID=a.AReferee2ID 

WHERE (m.Date BETWEEN '05-Jul-2011' AND '05-Jul-2014') 
+0

어떤 DBMS를 사용하고 있습니까? –

+0

DATE 및 TIME 열은 어떤 데이터 유형입니까? – MatBailie

+0

SQL 서버 2008 – user829634

답변

3

날짜 및 시간 열을 추가하고 -2 시간 +3 시간 간격과 비교하십시오.

select * 
from YourTable 
where Date+cast(Time as datetime) between dateadd(hour, -2, getdate()) and dateadd(year, 3, getdate()) 

위의 쿼리에서 Date의 인덱스를 사용할 수 있는지 확실하지 않습니다. 성능 문제가있는 경우 대신이 문제를 해결할 수 있습니다. 날짜 인덱스를 사용하면 더 효과적 일 수 있습니다.

select * 
from YourTable 
where Date between cast(getdate() as date) and dateadd(year, 3, getdate()) and 
     Date+cast(Time as datetime) > dateadd(hour, -2, getdate()) 
3

당신이 데이터베이스의 시간과 날짜 필드를 사용하는 경우, 당신은 간단한 현재 날짜로 비교할 수있다/시간

… 
WHERE `Date` > NOW() 
AND `Time` > NOW() 
+0

오늘은 10:10보다 늦은 날짜로만 가져옵니다. 따라서 위 테이블에서 itd는 아무 것도 반환하지 않습니다. – user829634

+0

글쎄, 당신의 작업 예제에서 (VB.BB를 통해) 계산 된 날짜와 시간을 전달하는 것만으로 왜 그것을 확장하지 않을까요? (m.Date BETWEEN '05 -Jul-2011 'AND '05 -Jul-2014') WHERE 절로 이동하십시오. 그렇다면 문제의 해결책은 무엇입니까? – feeela

+0

좋아, 나에게 말해 주려는 것을 이해하지만 이미 시도 : '어디서나 (m.Date BETWEEN '05 -Jul-2011'AND '05 -Jul-2014 ') AND m.Time> = '20 : 36 '' 은 7 월 5 일보다 큰 날짜와 20:36보다 늦은 날짜를 가져옵니다. 나는 7 월 6 일 이후부터 모든 시간을 표시하기를 원합니다. 현재 시간 이후의 모든 시간 - 2hours – user829634

1

을 나는에 가입하여 그것을 할 것 하위 쿼리. 같은 뭔가 :

 select ... 
    from Match as m 
    inner join 
     (select mSub.MatchID, 
     case when Date+cast(Time as datetime) between dateadd(hour,-2,getdate()) 
      and getdate() then 1 else 0 end as Show 
     from Match as mSub 
     where Date between 
      cast(getdate() as date) 
      and cast(dateadd(year,3,getdate()) as date) 
     ) as Control 
     on Control.MatchID=m.MatchID 

그래서 하위 쿼리 당신이 CASE 문에서 사용할 수있는 표시 열을 제공하며 필터링을 수행합니다.