Если у меня есть поле datetime, как мне получить только записи, созданные позже определенного времени, полностью игнорируя дату?
Это таблица журналов, она сообщает, когда люди подключаются и что-то делают в нашем приложении. Я хочу узнать, как часто люди выходят позже 17:00.
(Извините, это SQL Server. Но это может быть полезно другим людям для других баз данных)


Лучшее, что я могу придумать, это: не использовать поле DateTime; ну, вы можете использовать много DATEADD / DATEPART и т. д., но это будет медленным, если у вас много данных, так как здесь нельзя использовать индекс. Ваша БД может изначально предлагать подходящий тип - такой как тип TIME в SQL Server 2008 - но вы можете так же легко сохранить смещение времени в минутах (например).
Какую систему баз данных вы используете? Функции даты / времени сильно различаются.
Для Oracle вы могли бы сказать
SELECT * FROM TABLE
WHERE TO_CHAR(THE_DATE, 'HH24:MI:SS') BETWEEN '17:00:00' AND '23:59:59';
Кроме того, вам, вероятно, потребуется перейти на следующий день и также выбрать время между полуночью и, скажем, 6 утра.
@Joe: на самом деле> = '17: 00: 00 'или даже> =' 17 'тоже должно работать, я думаю
Для SQL Server:
select * from myTable where datepart(hh, myDateField) > 17
См. http://msdn.microsoft.com/en-us/library/aa258265(SQL.80).aspx.
Он принимает только целые часы, а не «определенное время», и не должен быть принятым ответом как есть.
Хорошо, я понял.
select myfield1,
myfield2,
mydatefield
from mytable
where datename(hour, mydatefield) > 17
Это даст мне записи с mydatefield со временем позже 17:00.
Вы также можете подумать о настоящих ранних часах утра и включить что-нибудь до 6 утра или что-то в этом роде ...
В этом случае мне все равно, но я вижу, что это нужно учитывать в других случаях (я просто пытаюсь выяснить, когда люди обычно отсутствуют, чтобы мы могли запланировать некоторое обслуживание БД).
Еще один метод 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.
В MySQL это будет
where time(datetimefield) > '17:00:00'
В Informix, предполагая, что вы используете поле DATETIME YEAR TO SECOND для хранения полной даты, вы должны написать:
WHERE EXTEND(dt_column, HOUR TO SECOND) > DATETIME(17:00:00) HOUR TO SECOND
EXTEND действительно может сжимать набор полей (а также расширять его, как следует из названия).
Как заметил Тило, это область крайних различий между СУБД (и Informix, безусловно, является одним из вариантов).
Для 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
Этот не вернет строки с 1/2 секунды до полуночи. Почему не просто> = '17: 00: 00 '.