Azure澳大利亚国防军的错误算术溢出错误将表达式转换为数据类型int

0

的问题

我的工作与蔚蓝ADF和我具有的问题时,我执行这种查询、客户、ADF

SELECT COUNT(*) AS c
FROM TABLE 
WHERE CONVERT(date, (FORMAT(DATEADD(second, CONVERT(bigint, TS) / 1000, '19700101'), 'yyyy-MM-dd'))) = CONVERT(Date, GETDATE())

输出是一个错误

算术溢出

但是,如果我改变的 = 来一个 >=,查询工作和返回的一种输出。

TS 是一个 UNIXTIMESTAMP 喜欢 1637680012264.

使用组合 >=< 是不好的,因为我处理不连续的天数(我需要用 WHERE TS IN (date1, date2, etc...)

可能有人帮帮我吗? 在此先感谢

azure azure-data-factory sql sql-server
2021-11-23 15:02:27
2

最好的答案

0

好的,我会改变的表来存储 datetime2 值,而不是复杂的划时代的垃圾。

但是,假设你不能修复的设计...

到Larnu点,你不想要应用计算,以分列,和你肯定不想要应用 FORMAT() 双方因为 FORMAT() 是一个绝对的狗.

相反,我会找到边界的今天,使用一个不限成员名额的范围。 这个假设 TS 列必须 bigint:

DECLARE @d date = GETDATE();

DECLARE @start bigint = DATEDIFF(SECOND, '19700101', @d),
        @end   bigint = DATEDIFF(SECOND, '19700101', DATEADD(DAY, 1, @d));

SELECT COUNT(*) AS c
FROM dbo.[TABLE]
WHERE TS >= @start * 1000 
  AND TS <  @end   * 1000;

这样可以避免的任何格式的开销,令人费解和不必要的转换表(TS 必须已经被一个 bigint,正确的,那么,为什么明确 CONVERT()?).


如果你需要的非连续的日期确定,我们仍然可以完成这远远少滥用的表格。 只要创建一个#临时表或表变量计算列入的多种日期,在那里,然后外加入它。

DECLARE @d table
(
  d datetime2, 
  s AS CONVERT(bigint, 
    DATEDIFF(SECOND, '19700101', d)) * 1000,
  e AS CONVERT(bigint, 
    DATEDIFF(SECOND, '19700101', DATEADD(DAY, 1, d))) * 1000
);

INSERT @d(d) VALUES('20211123'),('20211007');

-- if you want a row per day:
SELECT d.d, COUNT(t.TS) AS c
FROM @d AS d
LEFT OUTER JOIN dbo.[TABLE] AS t
   ON  t.TS >= d.s
   AND t.TS <  d.e
GROUP BY d.d
ORDER BY d.d;

-- if you just want a total count:
SELECT COUNT(t.TS) AS c
FROM @d AS d
LEFT OUTER JOIN dbo.[TABLE] AS t
   ON  t.TS >= d.s
   AND t.TS <  d.e;

更多关于日期的不良生活习惯和最佳做法:

2021-11-23 15:46:34

谢谢亚伦,即使解决方案这不是我是来找你照亮我的团队"那不是源的的错误。 DATEADD是不能增加3亿秒钟,到1970年。 所以也许鸿沟的一次尝试增加通过分钟,如果你只关心日期、第二级别的准确性不应该是重要的。 你能提供一两样值为TS的和预期的结果对于那些"。 所以转换的UNIXTIMESTAMP在日通过divinding为60*60*1000*24
Salvatore Bonanno

@SalvatoreBonanno但是,这仍然是一个效率极其低下的方法来解决这个问题。 你想的数学上的另一侧,在那里的条款,相信我。 除非 TS 列不是编制索引和你知道一个事实,你会从来没有索引。
Aaron Bertrand

是的,我看到的解决方案的临时表格。 最有问题的东西,我可以只读访问表(表在云)所以我什么都不知道有关索引(它可能是一个图呢!) . 这样的数学问题解决了这个问题现在,但我会尽力优化它,你说起来。
Salvatore Bonanno
-1

我会重现在我的地方澳大利亚国防军环境以及能够获得的结果成功。

下面的 示例表:

在这里,我还有3行的日期'2021-11-23'和2行,从'2021-11-24'. TS 列日期在UNIX timestamp格式和 dt_format 列以显示 TS 列在日期格式。

enter image description here

ADF:

使用的查询活动,得到该计数的行TS列有今天的日期。 (我用你的代码与不同的表格)。

SELECT COUNT(*) AS c
FROM tb1 
WHERE CONVERT(date, (FORMAT(DATEADD(second, CONVERT(bigint, TS) / 1000, '19700101'), 'yyyy-MM-dd'))) = CONVERT(Date, GETDATE())

enter image description here

输出:

enter image description here

2021-11-23 15:28:21

其他语言

此页面有其他语言版本

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................