如果差异小于 10 分钟,如何计算日期之间的时间
Posted
技术标签:
【中文标题】如果差异小于 10 分钟,如何计算日期之间的时间【英文标题】:How to sum time between dates if difference is less than 10 minutes 【发布时间】:2015-12-13 20:00:38 【问题描述】:我有模型 Activity,当用户进行某些活动时,我正在存储 timeInterval/NSDate,可能会出现用户休息 15 分钟然后返回的情况。只有当它们之间的差异小于 10 分钟时,我才想计算活动之间的时间,并测量他工作的实时时间。我如何创建 NSPredicate 来实现这一点?
【问题讨论】:
对数组进行操作会很容易,但我想为数据库编写查询以以优化的方式实现这一目标 我正在考虑使用日期\时间记录所有操作。然后使用可交换搜索运行 Group By 搜索,其中 where 子句是指示值是否应显示的指示符。然后在交换列上使用 SUM() 。 (Grrr ...示例来了)。 可能我找到了一个解决方案,我添加了另一个字段来记录“timeIntervalToPreviousRow”,然后在插入新行期间,我将上一行和下一行的差异更新到行,然后我可以排除这个相差10分钟以上的时间 下面提供了一个示例。 @mientus 我认为你的方法是合理的,应该行之有效。 【参考方案1】:为你准备好了。我认为下面是一个很好的例子。
-- Set Employee ID And Date Required Here
DECLARE @ID INT = 7;
DECLARE @Date SMALLDATETIME = '20150615';
--create our table
DECLARE @TableRows TABLE
(
ID TINYINT,
ActionLog SMALLDATETIME
);
-- Insert some data
INSERT INTO @TableRows
VALUES
(10,'20150615 16:01:00'),
(7,'20150615 16:02:00'),
(7,'20150615 16:04:00'),
(10,'20150615 16:04:00'),
(10,'20150615 16:23:00'),
(10,'20150615 16:25:00'),
(10,'20150615 16:26:00');
-- First CTE for Row Numbers
WITH RowNumCTE
AS
(SELECT
ROW_NUMBER() OVER(ORDER BY ActionLog) AS RowNum
, ActionLog
FROM
@TableRows
WHERE
ID = @ID AND
datediff(day, @Date, ActionLog) = 0
)
-- SUM of all the Minutes
SELECT
SUM(DATEDIFF(MINUTE,t2.ActionLog,t1.ActionLog)) as Mins
FROM RowNumCTE t1
LEFT JOIN RowNumCTE t2 ON T1.RowNum = T2.RowNum + 1
WHERE
DATEDIFF(MINUTE,t2.ActionLog,t1.ActionLog) < 10
【讨论】:
【参考方案2】:一个更好、更快的例子。这使用了 LEAD 窗口函数(在 SQL 2012 中创建)。
-- Set Required Date Here
DECLARE @Date SMALLDATETIME = '20150615';
--create our table
DECLARE @TableRows TABLE
(
TableID INT IDENTITY(1,1) PRIMARY KEY,
ID TINYINT,
ActionLog SMALLDATETIME
);
-- Insert some data
INSERT INTO @TableRows
VALUES
(10,'20150615 16:01:00'),
(7,'20150615 16:02:00'),
(7,'20150615 16:04:00'),
(10,'20150615 16:04:00'),
(10,'20150615 16:23:00'),
(10,'20150615 16:25:00'),
(10,'20150615 16:26:00');
-- First CTE for Row Numbers (To force the LEAD first in the QEP)
WITH AllMinsCTE
AS
(SELECT
ID AS EmployeeID,
DATEDIFF(MINUTE, ActionLog, LEAD(ActionLog) OVER(PARTITION BY id ORDER BY id, actionlog)) as Mins
FROM
@TableRows
WHERE
datediff(day, @Date, ActionLog) = 0
)
SELECT
EmployeeID,
SUM(AllMinsCTE.Mins) as Mins FROM AllMinsCTE
WHERE
AllMinsCTE.Mins < 10
Group BY EmployeeID;
【讨论】:
以上是关于如果差异小于 10 分钟,如何计算日期之间的时间的主要内容,如果未能解决你的问题,请参考以下文章