2011-07-05 19 views
6

así que tengo un cuadro que figura a continuaciónSQL - seleccionar registros después de la fecha/hora

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 

etc.

Actualmente tengo una regla en virtud de mi DONDE Declaración de manera que es muestra todos los días entre las hoy (por lo que sería 05/07/11 hasta la misma fecha 3 años después 05/07/14).

También me gustaría agregar otra regla debajo de la declaración WHERE para que solo muestre veces (cuando la fecha actual es igual a la fecha en la tabla) dos horas antes de la hora actual.

Así que en el 05/07/11 a las 19:00 debería mostrar:

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 

a las 21:46 en el mismo día, se debe mostrar ahora:

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

¿Cómo lo haría Lo hago en mi SQL? Estoy pensando que tendría que ser una declaración si entonces o un caso en ese momento, pero no he podido resolverlo?

TAMBIÉN La fecha se genera dentro de VB.Net, igual que el tiempo. SQL actual (y de trabajo) código es:

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

¿Qué DBMS está utilizando? –

+0

¿Y qué tipos de datos son las columnas FECHA y HORA? – MatBailie

+0

sql server 2008 – user829634

Respuesta

3

Agregando las columnas Fecha y hora y la comparación con el intervalo de -2 horas +3 años.

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

No estoy seguro de si se puede utilizar cualquier índice en Fecha en la consulta anterior. Si tiene problemas de rendimiento, puede probar esto en su lugar. Podría hacer un mejor trabajo usando un índice de fecha.

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

Si utiliza los campos de las bases de datos de fecha y hora, es posible comparación simple hasta la fecha/hora actual

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

que solo trae de regreso solo las fechas mayores que hoy con solo tiempos posteriores a 10:10, por lo que de las tablas de arriba, no devolverá nada – user829634

+0

Bueno, usted usa ' DÓNDE (m.Fecha ENTRE '05 -Jul-2011 'Y '05 -Jul-2014') 'en su ejemplo de trabajo, ¿por qué no lo expande al tiempo, pasando la fecha y la hora calculadas (a través de VB)? en la cláusula WHERE. Entonces, ¿cuál fue la pregunta, si tiene la solución en su ejemplo de trabajo? – feeela

+0

bien, entiendo lo que intenta decirme, pero ya lo intenté: 'DÓNDE (m.Fecha ENTRE '05 -Jul-2011' Y '05 -Jul-2014 ') AND m.Time> = '20 : 36 '' solo devuelve fechas que son mayores que el 5 de julio y tienen un tiempo posterior a las 20:36, quiero que se muestren todas las veces desde el 6 de julio en adelante, como un calendario, todas las veces después de la hora actual - 2 horas – user829634

1

lo haría mediante la unión a una sub consulta. Algo así como:

 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 

lo que la consulta sub le da su columna Mostrar que se puede utilizar en su sentencia CASE y lo hace el filtrado.

Cuestiones relacionadas