如何在具有GROUPBY子句的SQL查询的where子句中使用算术表达式,而不会产生算术溢出?

如何在具有GROUPBY子句的SQL查询的where子句中使用算术表达式,而不会产生算术溢出?,sql,tsql,azure,Sql,Tsql,Azure,我有一个Azure SQL DB,当我的查询运行过多行时,它会不断抛出算术溢出错误。这是我的查询集_END _TIME和集_START _TIME的净化版本,它们是浮点类型: select t1.value1 from TABLE1 t1 join TABLE2 t2 on t1.ID = t2.ID where (t1.SET_END_TIME - t1.SET_START_TIME) > 2 and t2.CREATED_AT > '201

我有一个Azure SQL DB,当我的查询运行过多行时,它会不断抛出算术溢出错误。这是我的查询集_END _TIME和集_START _TIME的净化版本,它们是浮点类型:

select t1.value1
from TABLE1 t1
    join TABLE2 t2
    on t1.ID = t2.ID
where
    (t1.SET_END_TIME - t1.SET_START_TIME) > 2
    and
    t2.CREATED_AT > '2017-06-11T00:00:00'
group BY
    t1.value1;
如果我在where子句中将日期限制为两天,并与另一个一起运行,则运行良好。例如,如果我加上

and t2.CREATED_AT < '2017-06-13T00:00:00'
因此,我知道这个问题在某种程度上与它正在运行的行数有关,但我不理解为什么,因为实际的算术运算应该只逐行进行。有人知道是什么导致了溢出错误,以及我如何修复我的查询以便能够在多行上运行吗

编辑:
我知道我有无效的值。我可以看到设置的开始时间值为1.79769313486232E+308和-8.98846567431158E+307。我是否可以告诉查询忽略无效值,例如,任何设置的开始时间>100和<0,这样它就不会尝试对它们运行算术?

我会怀疑设置的结束时间和设置的开始时间中的值以及导致错误的计算。您是否可以输出每一列,并查看SET_START_TIME是否在某个点为负值,从而产生您得到的错误?

尝试按删除组

如果要为t1.value添加不同的值,请在选择框中添加不同的关键字


只要想一想,根本原因是我在where子句中用于算术的列中的值无效,解决方案是在子查询中使用大小写表达式,首先清理我要对其执行算术的值,然后在外部查询中对其进行筛选。例如:

select
    t1.value1,
    count(*) as total_values
from
    (
        select
            t1.ID as innerID,
            (case when t1.SET_START_TIME < 10000 and t1.SET_START_TIME > 0 then t1.SET_START_TIME else 0 end) as set_start,
            (case when t1.SET_END_TIME < 10000 and t1.SET_END_TIME > 0 then t1.SET_END_TIME else 0 end) as set_end
        from TABLE1 t1
    ) innerTable
    join TABLE2 t2
    on innerID = t2.ID
where
    (set_end - set_start) > 2
    and
    t2.CREATED_AT > '2017-06-11T00:00:00'
group by
    t1.value1;

但我不认为是这些值,因为我可以在相同的范围内运行查询,只要范围较小,就不会得到错误。例如,在6月11日至13日和6月13日至15日运行它是有效的,但在6月11日至15日运行它是无效的。但是,您会得到更多的行,因此出错的可能性更大。只需要一行具有意外值就可以导致该错误。只需运行select并将该部分从where子句中删除,这将是解决/隔离问题的另一种方法。对不起,我不明白。如果它们是完全相同的行,仅在一种情况下,它们在两个单独的查询中运行,而在另一种情况下,它们在单个查询中运行,这将如何导致错误?例如,假设我有6行,A、B、C、D、E、F。当我运行6月11日至13日时,它运行在A、B、C上,当我运行6月13日至15日时,它运行在D、E、F上,这两个查询都可以正常工作。然后我运行6月11-15日,它运行在A,B,C,D,E,F上。因此,执行完全相同的算术运算,但是当运行所有6行时,它失败了。哦,对不起,误解了你。这令人费解。一定是那个计算器对吧?没有任何其他原因会导致该错误。如果是我,我会把它从where中取出,放到select中,看看是否有错误。。。我现在正在拉伸,不太确定。我需要分组。不幸的是,在实际查询中,这是一个计数。