Конвертировать тики в минуты - PullRequest
0 голосов
/ 12 сентября 2018

Я ищу способ преобразования BigInt во временное значение с использованием SQL, если это возможно. В нашей базе данных мы храним TimeSpan.Ticks в столбце, и мне нужно знать, сколько времени представляет каждое значение. Например, 3000000000 тиков равно 5 минутам. Мне нужно всего лишь минут для каждого IssueID. Вот SQL, который я написал, чтобы получить результаты:

SELECT i.IssueID, ia.TimeSpent 
FROM IssueActivities ia
INNER JOIN Issues i ON ia.IssueID = i.IssueID
INNER JOIN IssueActivityTypes iat ON ia.IssueActivityTypeID =   iat.IssueActivityTypeID
INNER JOIN AllPOCs apoc ON i.POCID = apoc.AllPOCID
INNER JOIN Users u ON ia.CreatedByUserID = u.UserID
WHERE i.issueid IN (41602, 41908)
AND ia.ActivityDate BETWEEN '03/05/2018 23:59:59' AND '03/06/2019 00:00:01'
ORDER BY ia.IssueID

Вот пример результатов

enter image description here

Я пытался преобразовать поле TimeSpent в DateTime CAST((ia.TimeSpent - 599266080000000000) / 10000000 / 24 / 60 / 60 AS DateTime), но я получаю это сообщение об ошибке Arithmetic overflow error converting expression to data type datetime.

Любые идеи о том, как я могу получить минутное значение поля TimeSpent и либо суммировать его по IssueID, либо просто показать минуты в другом столбце (затем я могу экспортировать их в Excel и рассчитать их оттуда).

Ответы [ 2 ]

0 голосов
/ 12 сентября 2018

Для преобразования в минуты (с округлением в меньшую сторону):

SELECT i.IssueID, 
  floor(ia.TimeSpent / 600000000.0 ) as minutes
FROM IssueActivities ia
INNER JOIN Issues i ON ia.IssueID = i.IssueID
INNER JOIN IssueActivityTypes iat ON ia.IssueActivityTypeID =   iat.IssueActivityTypeID
INNER JOIN AllPOCs apoc ON i.POCID = apoc.AllPOCID
INNER JOIN Users u ON ia.CreatedByUserID = u.UserID
WHERE i.issueid IN (41602, 41908)
AND ia.ActivityDate BETWEEN '03/05/2018 23:59:59' AND '03/06/2019 00:00:01'
ORDER BY ia.IssueID

Функция FLOOR() удаляет десятичные цифры значения с плавающей запятой.

0 голосов
/ 12 сентября 2018

Я не обязательно понимаю, почему вы запрашиваете результат как DateTime, если вам просто нужно преобразование в количество минут, но посмотрите на следующее:

SELECT  3000000000 / 600000000.0,
        300000000 / 600000000.0,
        DATEADD(MILLISECOND, 3000000000 / 10000.0, 0),
        DATEADD(MILLISECOND, 300000000 / 10000.0, 0)

первые две операции преобразуют тики в количество минут (с сохранением дробных компонентов).

Вторые две эффективно создают DateTime с количеством добавленных миллисекунд, соответствующих количеству тиков.

Вам необходимо решить, нужен ли вам дробный вывод или нет, и нужен ли он как DateTime или нет.

...