#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