SQL - Выбрать записи после текущей даты / времени - PullRequest
7 голосов
/ 05 июля 2011

Итак, у меня есть таблица, изложенная ниже

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

и т. Д.

В настоящее время у меня есть одно правило в моем выражении WHERE, так что оно показывает все дни между сегодняшними днями (так что это будетбыть 05/07/11 до той же даты 3 года спустя 05/07/14).

Я также хотел бы добавить еще одно правило в выражение WHERE, чтобы оно показывало только время (когда текущая датаравно дате в таблице) за два часа до текущего времени.

Итак, 05.07.11 в 19:00 должно появиться:

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?Я думаю, что это должен быть оператор if тогда или case тогда, но я не смог его обработать?

ТАКЖЕ Дата генерируется в 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') 

Ответы [ 3 ]

3 голосов
/ 05 июля 2011

Добавление столбцов «Дата и время» и сравнение с интервалом -2 часа +3 года.

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

Не уверен, можно ли использовать какой-либо индекс на дату в вышеуказанном запросе.Если у вас есть проблемы с производительностью, вы можете попробовать это вместо этого.Это может быть лучше, если использовать индекс даты.

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 голосов
/ 05 июля 2011

Если вы используете поля времени и даты в базах данных, вы можете просто сравнить их с текущей датой / временем

…
WHERE `Date` > NOW()
AND `Time` > NOW()
1 голос
/ 05 июля 2011

Я бы сделал это, присоединившись к подзапросу. Что-то вроде:

     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

Таким образом, подзапрос дает вам столбец Show, который вы можете использовать в вашем операторе CASE, и он выполняет фильтрацию.

...