DATEDIFF函数导致SQL Server 2016溢出

DATEDIFF函数导致SQL Server 2016溢出,sql,sql-server,sql-server-2016,Sql,Sql Server,Sql Server 2016,我在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 | 11632

我在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
我试图获得每秒
内存的平均值。为此,我尝试了以下查询:

SELECT 
    AVG(memory) AS avgMemory, 
    DATEADD(second, DATEDIFF(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(second, 0, t), 0) 
ORDER BY 
    t ASC;
但在执行时,我得到以下错误:

datediff函数导致溢出。分隔两个日期/时间实例的DatePart数量太多。尝试将datediff与不太精确的datepart一起使用

根据和这个,秒的最大差值可能是68年,但在我的例子中,它只有60秒

那我为什么会犯这个错误呢?我能做些什么来解决这个问题


以下是SQLFIDLE解决上述问题的方法:

SQL Server为此提供了
datediff\u big()

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;
您还可以通过将值转换为字符串来完成此操作:

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;

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

您也可以使用不同的日期(例如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;

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


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

2016年前的db,在group by上,我必须将DATEDIFF转换为bigint,然后由ms获得DATEDIFF的平均值。
avg(cast(datediff(ms,sdate,edate))作为BIGINT)作为avg

对我来说,它看起来像是在计算日期0和t值之间的差值。是否要计算最小t值与当前t值之间的差值?DATEDIFF(秒,0,t)存在问题。你想实现什么?我正在尝试将时间戳分组为秒/分钟/小时(取决于用户选择)。从2016年开始,对吗?如果他在上一版本?@sepupic OP明确提到SQL Server 2016。我会试试看。@Frank Schmitt当我写评论时,没有“2016”,只有“SQL”和“SQL Server”@sepupic OP在44分钟前编辑了问题正文,将2016包括在内(你的评论在我写这篇文章时添加了39分钟)而2016年标签确实是由Gordon Linoff在您的评论后添加的。开始和结束日期来自UI,因此我不能有一个静态日期。抱歉,我误解了您的答案,但现在我明白您所说的了。它是有效的。我将开始日期改为2017-01-01 00:00:00.000是的,谢谢你的想法。我将我的起始日期从0更新为2017-01-01 00:00:00.000,因为我知道我的表格中没有这之前的时间戳。