Результат SQL DATEDIFF отличается от Excel в доли часов - PullRequest
0 голосов
/ 28 ноября 2018

изо всех сил пытался найти способ обойти эту проблему.

Мы отходим от Excel и добавляем вычисления в SQL за доли часов, вычитая две даты.

Проблема в том, чтонаши результаты в Excel отличаются от SQL.

Вот что мы имеем в Excel:

Change Date: 30/10/2018      
Change Time: 10:53

Service Date: 29/10/2018    
Service Time: 9:37      

The Formula in excel is: =((Change Date+Change Time)-(Service Date+Service Time))*24

Результат в долях часов: 25.26666667

Те же данные, импортированные в SQL с использованием DATEDIFF (синтаксис ниже):

datediff(second,CAST(CAST(CONVERT(DATETIME,Service_Date,103) as smalldatetime) 
            + CAST(CONVERT(DATETIME,Service_Time,103) as smalldatetime) as smalldatetime),
            CAST(CAST(CONVERT(DATETIME,Change_Date,103) as smalldatetime) 
            + CAST(CONVERT(DATETIME,Change_Time,103) as smalldatetime) as smalldatetime)) /3600.0

дает результат: 26.350000

Кто-нибудь имеет представление о том, как решитьэто несоответствие?

Спасибо, куча заранее,

Юлиана

Ответы [ 2 ]

0 голосов
/ 28 ноября 2018

Проверьте ваши входы.Ваша логика верна, хотя ее можно упростить.Для ясности запустите приведенный ниже пример кода в SSMS.

declare @Service_Date varchar(max) = '30/10/2018'
declare @Service_Time varchar(max) = '10:53'

declare @Change_Date varchar(max) = '29/10/2018'
declare @Change_Time varchar(max) = '9:37'

--
-- Original 
--
select datediff(second,CAST(CAST(CONVERT(DATETIME,@Service_Date,103) as smalldatetime) 
            + CAST(CONVERT(DATETIME,@Service_Time,103) as smalldatetime) as smalldatetime),
            CAST(CAST(CONVERT(DATETIME,@Change_Date,103) as smalldatetime) 
            + CAST(CONVERT(DATETIME,@Change_Time,103) as smalldatetime) as smalldatetime)) /3600.0

--
-- Simplified - same result
--
select datediff(second,
    (CONVERT(smalldatetime,@Service_Date,103) + CONVERT(smalldatetime,@Service_Time,103)),
    (CONVERT(smalldatetime,@Change_Date,103) + CONVERT(smalldatetime,@Change_Time,103))) /3600.0

--
-- Simplfied - shows error is with inpuyts, not logic
--
set @Service_Time = '11:57'
set @Change_Time = '9:36'
select datediff(second,
    (CONVERT(smalldatetime,@Service_Date,103) + CONVERT(smalldatetime,@Service_Time,103)),
    (CONVERT(smalldatetime,@Change_Date,103) + CONVERT(smalldatetime,@Change_Time,103))) /3600.0
0 голосов
/ 28 ноября 2018

Параметры сортировки на уровне сервера могут убить любые вычисления, поэтому nomater, какой сервер вы используете, вы хотите убедиться, что вы на 100% уверены, что ваш string dates and times по существу преобразован в SQL Server datetime.

На основании вашего примера я предположил, что это обычный формат, который у вас есть, поэтому вы можете попробовать что-то вроде этого:

DECLARE @ExcelDate1 CHAR(10) = '30/10/2018'
DECLARE @ExcelTime1 CHAR(5) = '10:53'

DECLARE @ExcelDate2 CHAR(10) = '29/10/2018'
DECLARE @ExcelTime2 CHAR(5) = '09:37'

--> make sure that whatever server collation you use you will get a right date format:
DECLARE @ExcelDateTime1 datetime = DATETIMEFROMPARTS(CAST(RIGHT(@ExcelDate1,4) as int), CAST(SUBSTRING(@ExcelDate1,4,2) as int), CAST(LEFT(@ExcelDate1,2) as int), CAST(LEFT(@ExcelTime1,2) as int), CAST(RIGHT(@ExcelTime1,2) as int), 0, 0);
DECLARE @ExcelDateTime2 datetime = DATETIMEFROMPARTS(CAST(RIGHT(@ExcelDate2,4) as int), CAST(SUBSTRING(@ExcelDate2,4,2) as int), CAST(LEFT(@ExcelDate2,2) as int), CAST(LEFT(@ExcelTime2,2) as int), CAST(RIGHT(@ExcelTime2,2) as int), 0, 0);

SELECT ABS(DATEDIFF(mi, @ExcelDateTime1, @ExcelDateTime2) / 60.0);

РЕЗУЛЬТАТ: 25.266666

Чтобы получить 7 в качестве последней цифры вы можете использовать функцию ROUND().

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