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,谢谢你的帮助,问题已经解决了。这个解决方案不会给出我想要的结果。