如果可能的话,我正在寻找一种使用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
以下是结果示例
我尝试将TimeSpent字段强制转换为DateTime CAST((ia.TimeSpent - 599266080000000000) / 10000000 / 24 / 60 / 60 AS DateTime)
,但收到此错误消息Arithmetic overflow error converting expression to data type datetime.
关于如何获取TimeSpent字段的分钟值并将其总计在IssueID上或仅在另一列中显示分钟的任何想法(然后我可以导出到excel并从那里计算出来)。
答案 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()
函数去除浮点值的十进制数字。