SQL Server - Проверьте, находится ли данная дата + время между двумя переменными даты и времени по точной дате + времени - PullRequest
0 голосов
/ 08 октября 2018

У меня есть два столбца даты и времени в таблице БД: @Start и @ End.

Оба столбца содержат дату и время, например:

@Start: 2018-10-01 19:00:00
@End: 2018-10-10 23:59:00

Я хочу знать, если текущая дата точно между датами и временем, учитывая даты и время.

Таким образом, 2018-10-08 16:37 и 2018-10-10 23:59:00 будут соответствовать этому диапазону, а 2018-10-11 00:00:00 - нет.(В этом случае эта дата на одну минуту позже даты окончания, поэтому она не находится между моим диапазоном дат и времени).

SELECT Id FROM Table1 WHERE GETDATE() BETWEEN Start AND End

Я не использую GETDATE () в реальном коде, я использую аргумент,Проблема в том, что текущий аргумент даты может содержать секунды и миллисекунды, например 23:59:59.123.Мой код рассматривает такую ​​дату как не соответствующую заданному диапазону.Но меня не волнует с / мс.

Есть ли обходной путь?

Обновление:

Точность , которую я хочу достичь, находится в минут .Поэтому мне даже не нужно учитывать ни секунды, ни миллисекунды.Формат даты и времени, над которым я буду работать, будет «гггг-ММ-дд чч-мм», но я не знаю, как использовать предложение BETWEEN для преобразования начала и конца в показанный формат, чтобы я мог сравнить даты.

Ответы [ 4 ]

0 голосов
/ 08 октября 2018

Казалось бы, вам нужна эта логика:

WHERE GETDATE() >= Start
  AND GETDATE() < DATEADD(minute, 1, End)

Предполагая, что временная часть End равна 23:59:00, она охватывает все возможные значения от 23:59:00 до 23:59:59.999...999.

0 голосов
/ 08 октября 2018

TRY

SELECT Id FROM Table1 WHERE 
         CONVERT(varchar(16),GETDATE(),121) BETWEEN 
                  CONVERT(varchar(16),[Start], 121) 
                  AND 
                  CONVERT(varchar(16),[END],121);

Пример округления без строк

DECLARE @GetDateMinutes as datetime2;

DECLARE @X as datetime2 = getdate();

--round to minutes, could be made into a function
SET @GetDateMinutes = dateadd(minute,datepart(minute,@x),dateadd(hour, datepart(hour,@x),cast(CAST(@x as date) as datetime2)))

select @x, @GetDateMinutes
0 голосов
/ 08 октября 2018

Обрежьте секунды, используя описанную здесь технику , чтобы избежать всех преобразований строк, а затем просто сравните.Вот полностью содержащий пример, который использует cross apply и values для инкапсуляции логики усечения для начала и конца:

-- truncate minutes from current date time
declare @currentDateTime datetime2(0) = DateAdd(minute, DateDiff(minute, 0, Convert(datetime2(0), N'2018-10-01 23:58:32.912')), 0);

select @currentDateTime as CurrentDateTime
     , a.*
from (values -- create a table of dummy values
    (Convert(datetime2(3), N'2018-10-01 19:48:14.735'), Convert(datetime2(3), N'2018-10-10 02:00:00.000'))
  , (Convert(datetime2(3), N'2018-10-01 22:43:19.532'), Convert(datetime2(3), N'2018-11-01 12:17:26.663'))
) as a (StartDateTime, EndDateTime)
cross apply (values(
    -- truncate minutes from start date time
    DateAdd(minute, DateDiff(minute, 0, Convert(datetime2(0), a.StartDateTime)), 0)
    -- truncate minutes from end date time
  , DateAdd(minute, DateDiff(minute, 0, Convert(datetime2(0), a.EndDateTime)), 0)
)) as b (StartDateTimeWithoutSeconds, EndDateTimeWithoutSeconds)
where @currentDateTime between b.StartDateTimeWithoutSeconds and b.EndDateTimeWithoutSeconds;

Ваши данные, кажется, уже урезали s / ms от начала и конца, но вычислилиЯ бы применил ту же логику ко всем задействованным ценностям, чтобы быть последовательным.Вот формула для удаления s / ms без всего «шума» из примера:

DateAdd(minute, DateDiff(minute, 0, Convert(datetime2(0), <SomeDateTime>)), 0)
0 голосов
/ 08 октября 2018

ВЫБЕРИТЕ ИДЕНТИФИКАТОР ИЗ ТАБЛИЦЫ 1 ГДЕ GETDATE () МЕЖДУ '2018-10-01 19:00:00' И '2018-10-10 23:59:00'

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