Время обработки в SQL SERVER

#sql #sql-server

#sql #sql-сервер

Вопрос:

В хранимой процедуре мне нужно выполнить вычисление на основе разницы между 2 датами. Чтобы изменить ситуацию, я использую datediff(hour, @startDate, @endDate) . Но, в зависимости от часа, мне нужно добавить или нет 1.

Например, если @startDate = '2020-09-16 05:00 и @endDate = '2020-09-16 08:00 , я буду использовать только datediff(hour, @startDate, @endDate) . Но, если @startDate = '2020-09-16 05:00 и @endDate = '2020-09-16 08:01 , мне нужно сделать datediff(hour, @startDate, @endDate) 1 .

Проблема в том, что я не знаю, как обрабатывать «округленный час».

Комментарии:

1. Образцы данных и желаемые результаты в табличном формате помогли бы.

2. «в зависимости от часа мне нужно добавить или нет 1». — не могли бы вы более конкретно рассказать о том, какая здесь логика. Все, что вы сделали, это дали нам два образца и сказали: «Я делаю для этого, я не для этого». Как вы (и, следовательно, мы, и, в конечном итоге, компьютер) различаете эти два примера?

3. Не очень понятно, что вы имеете в виду, как было прокомментировано. Но я подозреваю, что ваша проблема может быть решена путем вычисления разницы в минутах и получения часов из этого.

4. ceiling(datediff(minute, @sdate, @edate)/ 60.0) ?

Ответ №1:

Вы могли бы проверить, является ли часть ‘минут’ конечной даты больше 0.

 declare
  @startDate      datetime='2020-09-16 05:00',
  @endDate        datetime='2020-09-16 08:01';

select datediff(hour, @startDate, @endDate) 
       case when (datepart(minute, cast(@endDate as time))>0) then 1 else 0 end;
  

Вывод

 4
  

Комментарии:

1. Спасибо @SteveC, это именно то, что мне нужно!

Ответ №2:

Предполагая, что вам нужно добавить 1 час, если вторая дата больше 8 утра, вы можете выполнить небольшой логический процесс, просто сравнив эту разницу и введя функцию DATEADD, например, с предыдущим использованием функции CAST:

 DECLARE @DATE1 DATETIME = '2020-09-16 05:00'
       ,@DATE2 DATETIME = '2020-09-16 08:01'

IF CAST(DATEDIFF(s, @DATE1, @DATE2) AS DECIMAL (9,3)) / 3600 > 3
BEGIN  
    SELECT 1 --Here replace this expression with your ADD logical part.
END
ELSE
BEGIN
    SELECT 0
END