SujataJK Ответов: 2

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


Привет,

Здесь я собираюсь заполнить табель учета рабочего времени против конкретного действия, назначенного мне(пользователю).
Предположим, что имя пользователя-user1, а действие, назначенное ему, - A1 .Теперь пользователь(user1) должен заполнить табель учета рабочего времени против A1 следующим образом

СР. дата активности пользователей fromTime свремя
1 user1 A1 2018-03-21 12:30 2:30

Когда пользователь1 собирается снова заполнить табель учета рабочего времени, он/она не должен использовать время между предыдущим fromTime и toTime.


Пожалуйста, помогите мне

Что я уже пробовал:

Это то, что я пробовал ,

DECLARE @FROM TIME
SET @FROM='12:30'
select complDate,fromtime,totime from tblTimeSheetMaster where @FROM  between Convert(time,fromtime) and Convert(time,totime) and complDate='2018-03-21'

Maciej Los

А что не так с вашим кодом?

SujataJK

В моей таблице это рекордный набор

Идентификатор complNo complNature complDate assignto статус приорит fromtime свремя

1. B0001/17-18 2018-03-1 баги HEMANT High Active 12:15 02:15
2. B0001/17-18 2018-03-21 баги HEMANT High Active 12:15 01:15

Согласно моему запросу результат будет следующим

2. B0001/17-18 2018-03-21 баги HEMANT High Active 12:15 01:15
но он не показывает никаких записей.

Maciej Los

Храните ли вы [FromTime] и [ToTime] в виде текста?

SujataJK

нет.
тип данных fromTime и totime - это время

Maciej Los

Взгляните на свои входные данные...
Время начала: 12:15
Время работы: 01:15
Вы ищете 12:30
В зависимости от настроек системы, 01:15-это меньше, чем 12:15, потому что 01:15-это после полуночи...
Понял?
Я бы предложил хранить эти два значения в виде типа данных DateTime.

SujataJK

да, вы правы.Я получил свою ошибку, большое спасибо.

2 Ответов

Рейтинг:
15

#realJSOP

Я думаю, что ваша проблема заключается в том, что ваши временные поля не являются 24-часовыми временами. В вашем примере 12:15 позже 02:15, поэтому ваше предложение between не будет работать так, как ожидалось. Выполните следующий запрос в SSMS и посмотрите на результат.

declare @start time = '12:15';
declare @complete time = '02:15';
declare @complete2 time = '14:15';
declare @from time = '12:30';

select 1 where @from between @start and @complete;

select 1 where @from between @start and @complete2;


Первый оператор select (используя 12-часовое время, которое у вас есть прямо сейчас) даст нулевой набор данных, но второй (используя 24-часовое форматированное время) вернет"1".

Наконец, что происходит, когда время завершения отражает следующий день? Я думаю, что ваша схема должна использовать datetime столбцы вместо отдельных date и time столбцы.

Не в SQL нюансов удовольствие?


Рейтинг:
12

Maciej Los

Согласно нашей дискуссии...

Проверить это:

DECLARE @tblTimeSheetMaster TABLE
(
	Id INT,
	complNo VARCHAR(30),
	complDate DATE,
	complNature VARCHAR(30),
	assignto VARCHAR(30),
	priorit VARCHAR(30),
	[status] VARCHAR(30),
	fromtime TIME,
	totime TIME
)

INSERT INTO @tblTimeSheetMaster(Id, complNo, complDate, complNature, assignto, priorit, [status], fromtime, totime)
VALUES(1, 'B0001/17-18', '2018-03-01', 'Bugs', 'HEMANT', 'High', 'Active', '00:15', '02:15'),
(2, 'B0001/17-18', '2018-03-21', 'Bugs', 'HEMANT', 'High', 'Active', '00:15', '01:15')

DECLARE @t TIME = '00:30'
DECLARE @d DATE = '2018-03-21'
DECLARE @dt DATETIME = CONVERT(DATETIME, @d) + CONVERT(DATETIME, @t)

--SELECT @dt 

SELECT T.*
FROM (
	SELECT Id, complNo, complDate, complNature, assignto, priorit, [status], 
		CONVERT(DATETIME, complDate) + CONVERT(DATETIME, fromtime) AS FromTime1, CONVERT(DATETIME, complDate) + CONVERT(DATETIME, totime) AS ToTime1
	FROM @tblTimeSheetMaster 
) T
WHERE @dt >=T.FromTime1 AND @dt<=T.ToTime1 

Результат:
2	B0001/17-18	2018-03-21	Bugs	HEMANT	High	Active	2018-03-21 00:15:00.000	2018-03-21 01:15:00.000



Для получения более подробной информации, пожалуйста, смотрите: время (Transact-SQL)[^]