Ответ 1
Я подозреваю, что вы хотите проверить это после 11:00 или до 7 утра:
select *
from MyTable
where CAST(Created as time) >= '23:00:00'
or CAST(Created as time) < '07:00:00'
У меня есть таблица, в которой есть столбец "Создано" как дата-время.
Я пытаюсь выполнить запрос, чтобы проверить, находится ли время для Созданного значения в два раза.
Созданное 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?
Я подозреваю, что вы хотите проверить это после 11:00 или до 7 утра:
select *
from MyTable
where CAST(Created as time) >= '23:00:00'
or CAST(Created as time) < '07:00:00'
select *
from MyTable
where CAST(Created as time) not between '07:00' and '22:59:59 997'
Это также должно работать (даже в 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))
У меня была очень похожая проблема и я хочу поделиться своим решением
Учитывая эту таблицу (все 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
: ничегоРассмотрим таблицу, в которой хранятся данные о смене
Пожалуйста, проверьте 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)
Должен быть И вместо OR
select *
from MyTable
where CAST(Created as time) >= '23:00:00'
AND CAST(Created as time) < '07:00:00'