2017-07-18 69 views
1

溢出我有一个表中的SQL Server 2016以下数据:DATEDIFF函数导致在SQL Server 2016

id  | t      | memory 
-------+-------------------------+------------ 
620255 | 2017-07-17 16:11:25.100 | 11632640 
620127 | 2017-07-17 16:11:24.100 | 11632640 
619999 | 2017-07-17 16:11:23.097 | 11632640 
619872 | 2017-07-17 16:11:22.097 | 11632640 

我试图让memory每秒的平均值。因此,为了做到这一点我想下面的查询:

​​

但在执行时,我收到以下错误:

The datediff function resulted in an overflow. The number of dateparts separating two date/time instances is too large. Try to use datediff with a less precise datepart.

由于每official docsSO post,几秒钟的最大差异是68年,但在我的情况下,只有60秒。

那么,为什么我会得到这个错误?我能做些什么来解决它?

这里是所提到的问题SQLFiddle:Fiddle

+0

对我来说,它看起来像你计算日期0和你的t值之间的差异。您是否想要计算最小t值与当前t值之间的差值? –

+0

'DATEDIFF(秒,0,t)'有问题。你想用这个做什么? – Rokuto

+0

我想按秒/分钟/小时对时间戳进行分组(取决于用户选择)。 –

回答

1

这里的问题是“开始日期”。

select DATEDIFF(second, 0, t) 0表示1900-01-01与2017年相距太远,所以从1900-01-01到2017-07-17的时间以秒为单位溢出了简单整数,它不仅仅是“60秒”

+0

是的,谢谢你的想法。我将我的开始日期从0更新为2017-01-01 00:00:00:00,因为我知道在此之前我没有时间戳。 –

1

SQL Server提供datediff_big()为了这个目的:

SELECT AVG(memory) AS avgMemory, 
     CONVERT(VARCHAR(19), t, 120) as t 
FROM Table1 AS Table1 
WHERE t BETWEEN '2017-07-17 16:11:00.000' AND '2017-07-17 16:12:00.000' 
GROUP BY CONVERT(VARCHAR(19), t, 120) 
ORDER BY t ASC; 

SELECT AVG(memory) AS avgMemory, 
     DATEADD(second, DATEDIFF_BIG(second, 0, t), 0) AS t 
FROM Table1 AS Table1 
WHERE t BETWEEN '2017-07-17 16:11:00.000' AND '2017-07-17 16:12:00.000' 
GROUP BY DATEADD(second, DATEDIFF_BIG(second, 0, t), 0) 
ORDER BY t ASC; 

您还可以通过数值转换为字符串做到这一点

此版本适用于所有支持的SQL Server版本。

+0

从2016开始吧?如果他在以前的版本? – sepupic

+1

@sepupic OP明确提到了SQL Server 2016. –

+0

我会尝试这个。 –

1

您还可以使用不同的日期(例如2017-07-17 00:00:00.000)作为固定点为您算了一笔账:

SELECT AVG(memory) AS memory, 
    DATEADD(second, 
      DATEDIFF(second, '2017-07-17 00:00:00.000', t), 
      '2017-07-17 00:00:00.000') AS t 
FROM Table1 AS Table1 
WHERE t BETWEEN '2017-07-17 16:11:00.000' AND '2017-07-17 16:12:00.000' 
GROUP BY DATEADD(second, 
       DATEDIFF(second, '2017-07-17 00:00:00.000', t), 
       '2017-07-17 00:00:00.000') 
ORDER BY t ASC; 

SQL Fiddle

+0

开始和结束日期来自用户界面,所以我不能有一个静态的日期。 –

+1

对不起,我误解了你的答案,但现在我明白你在说什么了。它的工作原理。我将开始日期更改为2017-01-01 00:00:00。000 –