Как получить записи через определенное время, используя поле даты и времени SQL - PullRequest
15 голосов
/ 07 октября 2008

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

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

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

Ответы [ 8 ]

18 голосов
/ 07 октября 2008

Для SQL Server:

select * from myTable where datepart(hh, myDateField) > 17

См. http://msdn.microsoft.com/en-us/library/aa258265(SQL.80).aspx.

5 голосов
/ 07 октября 2008

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

Для Oracle вы могли бы сказать

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

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

4 голосов
/ 07 октября 2008

В MySQL это будет

where time(datetimefield) > '17:00:00'
1 голос
/ 12 июля 2016

Для 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 голос
/ 07 октября 2008

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

0 голосов
/ 11 октября 2008

В Informix, если вы используете поле DATETIME YEAR TO SECOND для хранения полной даты, вы должны написать:

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

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

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

0 голосов
/ 07 октября 2008

Другой метод 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.

0 голосов
/ 07 октября 2008

Хорошо, я понял.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...