hora - Cómo obtener registros después de un cierto tiempo usando el campo SQL datetime
time sql (8)
Si tengo un campo de fecha y hora, ¿cómo obtengo solo los registros creados después de un tiempo determinado, ignorando la fecha por completo?
Es una tabla de registro que indica cuándo las personas se conectan y hacen algo en nuestra aplicación. Quiero saber con qué frecuencia las personas llegan después de las 5 p.m.
(Lo siento, es SQL Server. Pero esto podría ser útil para otras personas para otras bases de datos)
¿Qué sistema de base de datos estás usando? Las funciones de fecha / hora varían ampliamente.
Para Oracle, podrías decir
SELECT * FROM TABLE
WHERE TO_CHAR(THE_DATE, ''HH24:MI:SS'') BETWEEN ''17:00:00'' AND ''23:59:59'';
Además, probablemente deba pasar al siguiente día y también seleccionar las horas entre la medianoche y, por ejemplo, las 6 a. M.
Lo mejor que puedo pensar sería: no use un campo DateTime; bueno, podrías usar mucho DATEADD / DATEPART, etc., pero será lento si tienes muchos datos, ya que no puede usar un índice aquí. Es posible que su base de datos ofrezca un tipo adecuado de forma nativa, como el tipo de HORA en SQL Server 2008, pero también puede almacenar fácilmente la compensación de tiempo en minutos (por ejemplo).
Para SQL Server:
select * from myTable where datepart(hh, myDateField) > 17
Ver http://msdn.microsoft.com/en-us/library/aa258265(SQL.80).aspx .
En MySQL, esto sería
where time(datetimefield) > ''17:00:00''
Otro método de Oracle para situaciones simples:
select ...
from ...
where EXTRACT(HOUR FROM my_date) >= 17
/
http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/functions050.htm#SQLRF00639
Difícil para algunas preguntas, como todos los registros con un tiempo entre las 15:03:21 y las 15:25:45. También usaría el método TO_CHAR allí.
En Informix, suponiendo que utiliza un campo DATETIME YEAR TO SECOND para mantener la fecha completa, debe escribir:
WHERE EXTEND(dt_column, HOUR TO SECOND) > DATETIME(17:00:00) HOUR TO SECOND
''EXTEND'' puede, de hecho, contratar el conjunto de campos (y ampliarlo, como su nombre lo sugiere).
Como señaló Thilo, esta es un área de extrema variabilidad entre DBMS (y Informix es ciertamente una de las variantes).
Ok, lo tengo.
select myfield1,
myfield2,
mydatefield
from mytable
where datename(hour, mydatefield) > 17
Esto me dará registros con un mydatefield con un tiempo posterior a las 5 p.m.
Para MSSQL usa el método CONVERT:
DECLARE @TempDate datetime = ''1/2/2016 6:28:03 AM''
SELECT
@TempDate as PassedInDate,
CASE
WHEN CONVERT(nvarchar(30), @TempDate, 108) < ''06:30:00'' then ''Before 6:30am''
ELSE ''On or after 6:30am''
END,
CASE
WHEN CONVERT(nvarchar(30), @TempDate, 108) >= ''10:30:00'' then ''On or after 10:30am''
ELSE ''Before 10:30am''
END