将刻度转换为分钟

时间:2018-09-12 17:51:33

标签: sql sql-server sql-server-2012

如果可能的话,我正在寻找一种使用SQL将BigInt转换为时间值的方法。在我们的数据库中,我们将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 :(得分:1)

如果您只需要转换为分钟数,我不一定理解为什么您要以DateTime的形式来查询结果,但是请看以下内容:

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

前两个操作将刻度线转换为分钟数(保留了小数部分)。

后两个有效地创建了DateTime,其中添加的毫秒数对应于刻度数。

您需要考虑是否需要小数输出,以及是否需要将其作为DateTime

答案 1 :(得分:1)

要转换为分钟(四舍五入):

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()函数去除浮点值的十进制数字。