2017-02-22 2 views
0

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

declare @startdate time = '08:00:00', @enddate time = '01:00:00' 
declare @hour varchar(25),@minutes varchar(25),@seconds varchar(25) 

set @hour=datediff(ss,@startdate,@enddate)/60/60%12 
set @minutes= datediff(ss,@startdate,@enddate)/60%60 
set @seconds= datediff(ss,@startdate,@enddate)%60 

select @hour+':'[email protected]+':'[email protected] 

Я вычисляю разницу на 12 часов. Я ожидаю, что разница составляет 5 часов. но он показывает мне -7 часов. может кто-нибудь объяснить?

ответ

3

По умолчанию сервер sql занимает 24-часовой формат. Вы можете указать, является ли это A.M или P.M.

declare @startdate time = '08:00:00 AM', @enddate time = '01:00:00 PM' 
SELECT DATEDIFF(HH,@startdate,@enddate) 

Это работает, если указанное время не включает две разные даты, если не указано иное. Ex:

declare @startdate time = '08:00:00 PM', @enddate time = '01:00:00 PM' 
    SELECT DATEDIFF(HH,@startdate,@enddate) 

Это приведет к неправильному значению, как @enddate падает на следующий день. Чтобы получить лучшие результаты, рекомендуется указывать даты вместе со временем.

select datediff(HH, '02-21-2017 08:00:00 pm' ,'02-22-2017 01:00:00 PM') 
2

Этот выход является точно верным. 01:00 на 7 часов меньше, чем в 08:00. Вот почему вы получаете отрицательное число.

Вы сказали, что вычисляете разницу, используя 12-часовые часы. Итак, вам нужно указать, что SQL Server каким-то образом. Либо используйте 13:00 в качестве конечного времени, либо проанализируйте дату с индикатором меридиана AM или PM в строке времени.

I высоко рекомендую вам иметь дело только со временем в течение 24 часов. Это избавит вас от многих головных болей и сделает код более понятным. Сохраните презентацию времени и разбор для слоя пользовательского интерфейса.

+0

спасибо за разъяснение, но теперь я принимаю startdate = '08: 00: 00 pm 'и enddate = '01: 00: 00 pm', но все же застрял с тем же результатом, т.е. -7, и выход должен быть как 17 часов потому что время начинается с ночи 8 часов до полудня 1 часа. Зачем ? используя как 12, так и 24 такта –

+0

Попробуйте пропустить дату вместе со временем. Это должно дать желаемый результат. – Vikram

+0

точно работает, спасибо –