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

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

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

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

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
19
0
69 093
8
Перейти к ответу Данный вопрос помечен как решенный

Ответы 8

Лучшее, что я могу придумать, это: не использовать поле 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 утра.

Этот не вернет строки с 1/2 секунды до полуночи. Почему не просто> = '17: 00: 00 '.

Joe 07.10.2008 14:56

@Joe: на самом деле> = '17: 00: 00 'или даже> =' 17 'тоже должно работать, я думаю

Thilo 07.10.2008 15:15
Ответ принят как подходящий

Для SQL Server:

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

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

Он принимает только целые часы, а не «определенное время», и не должен быть принятым ответом как есть.

undrline - Reinstate Monica 17.04.2019 20:59

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

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

Это даст мне записи с mydatefield со временем позже 17:00.

Вы также можете подумать о настоящих ранних часах утра и включить что-нибудь до 6 утра или что-то в этом роде ...

Thilo 07.10.2008 03:39

В этом случае мне все равно, но я вижу, что это нужно учитывать в других случаях (я просто пытаюсь выяснить, когда люди обычно отсутствуют, чтобы мы могли запланировать некоторое обслуживание БД).

thursdaysgeek 07.10.2008 03:43

Еще один метод 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 

Другие вопросы по теме