Sql server 如何在SQL中计算时间

Sql server 如何在SQL中计算时间,sql-server,tsql,time,Sql Server,Tsql,Time,我有一张像这样的桌子 ID DTTM 123456789 2017-10-05 08:00:00.000 123456789 2017-10-05 08:05:00.000 123456789 2017-10-05 08:07:00.000 123456789 2017-10-05 08:15:00.000 123456789 2017-10-05 08:25:00.000 123456789 2017-10-05 09:00:00.000 12

我有一张像这样的桌子

ID              DTTM
123456789   2017-10-05 08:00:00.000
123456789   2017-10-05 08:05:00.000
123456789   2017-10-05 08:07:00.000
123456789   2017-10-05 08:15:00.000
123456789   2017-10-05 08:25:00.000
123456789   2017-10-05 09:00:00.000
123456789   2017-10-05 09:01:00.000
123456789   2017-10-05 09:02:00.000
123456789   2017-10-05 09:03:00.000
123456789   2017-10-05 11:00:00.000
我需要根据时间间隔创建一个标志(日期无关紧要) 必须每隔15分钟将标志设置为1 因此,在本例中,第1、4、6、10行将是标志,该ID的总数将为4 每次如果
间隔>=15分钟
将再次启动,直到下一次 我试过这样的东西; 以我的头为例

(
Select        top 100 percent 
            ID,
            DTTM,                
            LEAD(DTTM,1) over (partition by ID order by DTTM) as NextDTTM
From        Example
Order by    ID
), myCount
AS
(
Select      Top 100 percent
            ID,
            DTTM,
            NextDTTM,
            DateDiff("MINUTE",DTTM,NextDTTM) as Interval
from        myLead
)
Select      ID,
            DTTM,
            NextDTTM,
            Interval,
            Case When Interval >= 15 then 1 else 0 END as CountFlag
From        myCount
Where       Interval is not NULL
Order by    ID
但它并没有像预期的那样工作?我该如何解决这个问题

谢谢,
Oded Dror

如果您使用MySQL,那么您可以尝试使用
TIMEDIFF(param1,param2)

*param1和param2可以是times或datetimes值

如果使用MySQL,则可以尝试使用
TIMEDIFF(param1,param2)

*param1和param2可以是times或datetimes值

我不确定您需要标志的外观,但使用SQL Server 2012它们是两个棘手的部分。首先,要获取下一行和上一行之间的时间差:

DECLARE @DataSource TABLE
(
    [ID] BIGINT
   ,[DTTM] DATETIME2
);

INSERT INTO @DataSource ([ID], [DTTM])
VALUES   (123456789, '2017-10-05 08:00:00.000')
        ,(123456789, '2017-10-05 08:05:00.000')
        ,(123456789, '2017-10-05 08:07:00.000')
        ,(123456789, '2017-10-05 08:15:00.000')
        ,(123456789, '2017-10-05 08:25:00.000')
        ,(123456789, '2017-10-05 09:00:00.000')
        ,(123456789, '2017-10-05 09:01:00.000')
        ,(123456789, '2017-10-05 09:02:00.000')
        ,(123456789, '2017-10-05 09:03:00.000')
        ,(123456789, '2017-10-05 11:00:00.000');

SELECT *  
      ,DATEDIFF(MINUTE,CONVERT(TIME, [DTTM]),LEAD(CONVERT(TIME, [DTTM]), 1, NULL) OVER (PARTITION BY [ID] ORDER BY [DTTM])) AS [Minutes]
FROM @DataSource
ORDER BY [DTTM];

然后,我们需要
求和
从超间隔乞讨到当前行的分钟数,并将它们除以
15

WITH DataSource AS
(
    SELECT *  
          ,DATEDIFF(MINUTE,LAG(CONVERT(TIME, [DTTM]), 1, NULL) OVER (PARTITION BY [ID] ORDER BY [DTTM]), CONVERT(TIME, [DTTM])) AS [Minutes]
    FROM @DataSource
)
SELECT *
      ,SUM(ISNULL([Minutes], 0)) OVER (PARTITION BY [ID] ORDER BY [DTTM] ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) / 15 AS [MinutesRank]
FROM DataSource;

有了这个,你可以做你需要做的任何事情,就像我们现在知道每一排还有多少分钟一样。例如:

WITH DataSource AS
(
    SELECT *  
          ,DATEDIFF(MINUTE,LAG(CONVERT(TIME, [DTTM]), 1, NULL) OVER (PARTITION BY [ID] ORDER BY [DTTM]), CONVERT(TIME, [DTTM])) AS [Minutes]
    FROM @DataSource
)
, DataSourceMinutesTotal AS
(
    SELECT *
          ,SUM(ISNULL([Minutes], 0)) OVER (PARTITION BY [ID] ORDER BY [DTTM] ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) / 15 AS [MinutesRank]
    FROM DataSource
)
SELECT [ID], [DTTM]
      ,DENSE_RANK() OVER (PARTITION BY [ID] ORDER BY ISNULL([MinutesRank], 0)) AS [IntervalID]
FROM DataSourceMinutesTotal
ORDER BY [DTTM];

我不确定您需要标志的外观,但是使用
SQLServer2012
它们是两个棘手的部分。首先,要获取下一行和上一行之间的时间差:

DECLARE @DataSource TABLE
(
    [ID] BIGINT
   ,[DTTM] DATETIME2
);

INSERT INTO @DataSource ([ID], [DTTM])
VALUES   (123456789, '2017-10-05 08:00:00.000')
        ,(123456789, '2017-10-05 08:05:00.000')
        ,(123456789, '2017-10-05 08:07:00.000')
        ,(123456789, '2017-10-05 08:15:00.000')
        ,(123456789, '2017-10-05 08:25:00.000')
        ,(123456789, '2017-10-05 09:00:00.000')
        ,(123456789, '2017-10-05 09:01:00.000')
        ,(123456789, '2017-10-05 09:02:00.000')
        ,(123456789, '2017-10-05 09:03:00.000')
        ,(123456789, '2017-10-05 11:00:00.000');

SELECT *  
      ,DATEDIFF(MINUTE,CONVERT(TIME, [DTTM]),LEAD(CONVERT(TIME, [DTTM]), 1, NULL) OVER (PARTITION BY [ID] ORDER BY [DTTM])) AS [Minutes]
FROM @DataSource
ORDER BY [DTTM];

然后,我们需要
求和
从超间隔乞讨到当前行的分钟数,并将它们除以
15

WITH DataSource AS
(
    SELECT *  
          ,DATEDIFF(MINUTE,LAG(CONVERT(TIME, [DTTM]), 1, NULL) OVER (PARTITION BY [ID] ORDER BY [DTTM]), CONVERT(TIME, [DTTM])) AS [Minutes]
    FROM @DataSource
)
SELECT *
      ,SUM(ISNULL([Minutes], 0)) OVER (PARTITION BY [ID] ORDER BY [DTTM] ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) / 15 AS [MinutesRank]
FROM DataSource;

有了这个,你可以做你需要做的任何事情,就像我们现在知道每一排还有多少分钟一样。例如:

WITH DataSource AS
(
    SELECT *  
          ,DATEDIFF(MINUTE,LAG(CONVERT(TIME, [DTTM]), 1, NULL) OVER (PARTITION BY [ID] ORDER BY [DTTM]), CONVERT(TIME, [DTTM])) AS [Minutes]
    FROM @DataSource
)
, DataSourceMinutesTotal AS
(
    SELECT *
          ,SUM(ISNULL([Minutes], 0)) OVER (PARTITION BY [ID] ORDER BY [DTTM] ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) / 15 AS [MinutesRank]
    FROM DataSource
)
SELECT [ID], [DTTM]
      ,DENSE_RANK() OVER (PARTITION BY [ID] ORDER BY ISNULL([MinutesRank], 0)) AS [IntervalID]
FROM DataSourceMinutesTotal
ORDER BY [DTTM];

谢谢您联系我,问题解决了。你的方法没有解决这个问题。谢谢你联系我,问题解决了。你的方法并没有解决问题。Gotqn,谢谢你的帮助,问题已经解决了。这个解决方案不会给出我想要的结果。Gotqn,谢谢你的帮助,问题已经解决了。这个解决方案不会给出我想要的结果。