Проверьте, находится ли время между двумя моментами (время DataType)

У меня есть таблица, в которой есть столбец "Создано" как дата-время.

Я пытаюсь выполнить запрос, чтобы проверить, находится ли время для Созданного значения в два раза.

Созданное datetime для первой строки - "2013-07-01 00: 00: 00.000" (Midnight), и я пытаюсь запросить элементы с временем между 11 и 7 утрами.

select *
from MyTable
where CAST(Created as time) between '23:00:00' and '06:59:59'

Но результаты не возвращаются.

Нужно ли мне преобразовывать время в datetimes?

Ответ 1

Я подозреваю, что вы хотите проверить это после 11:00 или до 7 утра:

select *
from MyTable
where CAST(Created as time) >= '23:00:00' 
   or CAST(Created as time) < '07:00:00'

Ответ 2

select *
from MyTable
where CAST(Created as time) not between '07:00' and '22:59:59 997'

Ответ 3

Это также должно работать (даже в SQL Server 2005):

SELECT *
FROM dbo.MyTable
WHERE Created >= DATEADD(hh,23,DATEADD(day, DATEDIFF(day, 0, Created - 1), 0))
  AND Created <  DATEADD(hh,7,DATEADD(day, DATEDIFF(day, 0, Created), 0))

DEMO

Ответ 4

У меня была очень похожая проблема и я хочу поделиться своим решением

Учитывая эту таблицу (все MySQL 5.6):

create table DailySchedule
(
  id         int auto_increment primary key,
  start_time time not null,
  stop_time  time not null
);

Выберите все строки, где заданное время x (hh:mm:ss) находится между временем начала и остановки. Включая следующий день.

Примечание: замените NOW() на любое время x вам нравится

SELECT id
FROM DailySchedule
WHERE
  (start_time < stop_time AND NOW() BETWEEN start_time AND stop_time)
  OR
  (stop_time < start_time AND NOW() < start_time AND NOW() < stop_time)
  OR
  (stop_time < start_time AND NOW() > start_time)

Результаты

Дано

  id: 1, start_time: 10:00:00, stop_time: 15:00:00
  id: 2, start_time: 22:00:00, stop_time: 12:00:00
  • Выбранные строки с NOW = 09:00:00: 2
  • Выбранные строки с NOW = 14:00:00: 1
  • Выбранные строки с NOW = 11:00:00: 1,2
  • Выбранные строки с NOW = 20:00:00: ничего

Ответ 5

Рассмотрим таблицу, в которой хранятся данные о смене

enter image description here

Пожалуйста, проверьте SQL-запросы для генерации таблицы и поиска расписания на основе ввода (времени)

Объявление переменной таблицы

declare @MyShiftTable table(MyShift int,StartTime time,EndTime time)

Добавление значений в переменную Table

insert into @MyShiftTable select 1,'01:17:40.3530000','02:17:40.3530000'
insert into @MyShiftTable select 2,'09:17:40.3530000','03:17:40.3530000'
insert into @MyShiftTable select 3,'10:17:40.3530000','18:17:40.3530000'

Создание другой переменной таблицы с дополнительным полем под названием "Флаг"

declare @Temp table(MyShift int,StartTime time,EndTime time,Flag int)

Добавление значений во временную таблицу с заменой времени начала и окончания

вставьте в @Temp выберите MyShift, в случае, когда (StartTime> EndTime), а затем EndTime else StartTime end, в случае, когда (StartTime> EndTime), а затем StartTime else EndTime end, в случае, когда (StartTime> EndTime), тогда 1 else 0 заканчивается с @MyShiftTable

Создание входной переменной для поиска Shift

declare @time time=convert(time,'10:12:40.3530000')

Запрос, чтобы найти сдвиг, соответствующий установленному времени

выберите myShift из @Temp, где
(@time между StartTime и EndTime и Flag = 0) или (@time не между StartTime и EndTime и Flag = 1)

Ответ 6

Должен быть И вместо OR

select *
from MyTable
where CAST(Created as time) >= '23:00:00' 
   AND CAST(Created as time) < '07:00:00'