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