Как получить записи через определенное время с использованием поля SQL datetime

Если у меня есть поле datetime, как мне получить только записи, созданные позже определенного времени, вообще игнорируя дату?

Это таблица журналов, она рассказывает, когда люди подключаются и делают что-то в нашем приложении. Я хочу узнать, как часто люди наступают позже 5 вечера.

(Извините - это SQL Server, но это может быть полезно для других людей для других баз данных)

Ответы

Ответ 2

Какую систему баз данных вы используете? Функции даты/времени сильно различаются.

Для Oracle вы можете сказать

SELECT * FROM TABLE 
  WHERE TO_CHAR(THE_DATE, 'HH24:MI:SS') BETWEEN '17:00:00' AND '23:59:59';

Кроме того, вам, вероятно, придется переходить на следующий день, а также выбирать время между полуночью и, скажем, 6 утрами.

Ответ 3

В MySQL это будет

where time(datetimefield) > '17:00:00'

Ответ 4

Лучшее, что я могу подумать: не использовать поле DateTime; хорошо, вы могли бы использовать много DATEADD/DATEPART и т.д., но это будет медленно, если у вас много данных, так как он не может действительно использовать индекс здесь. Ваша БД может предложить подходящий тип изначально - например, тип TIME в SQL Server 2008, но вы можете так же легко сохранить смещение по времени в минутах (например).

Ответ 5

Для MSSQL используйте метод 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 

Ответ 6

Хорошо, у меня есть.

select myfield1, 
       myfield2, 
       mydatefield
  from mytable
 where datename(hour, mydatefield) > 17

Это даст мне записи с mydatefield со временем позже 5 вечера.

Ответ 7

Другой метод Oracle для простых ситуаций:

select ...
from   ...
where  EXTRACT(HOUR FROM my_date) >= 17
/

http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/functions050.htm#SQLRF00639

Уловка для некоторых вопросов, хотя, как и все записи со временем между 15:03:21 и 15:25:45. Я также использовал бы метод TO_CHAR.

Ответ 8

В Informix, предполагая, что вы используете поле DATETIME YEAR TO SECON, чтобы провести полную дату, вы должны написать:

WHERE EXTEND(dt_column, HOUR TO SECOND) > DATETIME(17:00:00) HOUR TO SECOND

"EXTEND" действительно может сжимать множество полей (а также расширять его, как следует из названия).

Как отметил Тило, это область экстремальной изменчивости между СУБД (и Informix, безусловно, является одним из вариантов).