Azure ADF错误将表达式转换为数据类型int时发生算术溢出错误



我正在使用azure ADF,在azure 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是类似于1637680012264UNIXTIMESTAMP

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

有人能帮我吗?提前感谢

最好将表更改为存储datetime2值,而不是复杂的epoch垃圾。

但是,假设你无法修复设计。。。

就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;
  • 示例db<gt;小提琴

这避免了任何格式化开销、复杂和不必要的转换表达式(TS必须已经是bigint,对吧,那么为什么要使用显式CONVERT()呢?(。


如果您需要不连续的日期,好吧,我们仍然可以用更少的表格滥用来实现这一点。只需创建一个带有计算列的#temp表或表变量,在其中插入多个日期,然后外部联接即可。

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;
  • 示例db<gt;小提琴

更多约会中的坏习惯&最佳实践:

  • 快速约会

最新更新