Azure ADF de Error error de desbordamiento Aritmético expresión de conversión de tipo de datos int

0

Pregunta

Estoy trabajando con azure ADF y estoy teniendo problemas cuando yo ejecute esta consulta en 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())

La salida es un error

Desbordamiento aritmético

pero si puedo cambiar el = a un >=la consulta funciona y devuelve un resultado.

El TS es un UNIXTIMESTAMP como 1637680012264.

Mediante la combinación de >= y < no está bien porque estoy tratando de no contiguos días (tengo que usar WHERE TS IN (date1, date2, etc...)

Podría alguien ayudarme? Gracias de antemano

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

Mejor respuesta

0

Preferiblemente, me gustaría cambiar la tabla para almacenar datetime2 valores en lugar de la convulsionada época de la basura.

Pero, suponiendo que usted no puede arreglar el diseño...

A Larnu punto, usted no desea aplicar los cálculos de la columna, y definitivamente no desea aplicar FORMAT() a ambos lados debido a que FORMAT() es una absoluta perro.

En su lugar, me gustaría encontrar a los límites para el día de hoy, y el uso de un intervalo abierto. Esto supone la TS la columna debe ser 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;

Esto evita cualquier formato de sobrecarga, complicado e innecesario convertir expresiones (TS ya debe ser un bigint, a la derecha, así que ¿por qué el explícito CONVERT()?).


Si usted necesita no contiguos fechas, ok, todavía podemos lograr esto con mucho menos abuso de la tabla. Sólo tienes que crear una tabla #temp o variable de tabla con columnas calculadas, insertar sus múltiples fechas en no y, a continuación, exterior unirse a ella.

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;

Mucho más en la fecha de los malos hábitos y las mejores prácticas:

2021-11-23 15:46:34

Gracias Aaron, a pesar de que su solución no es lo que yo estaba buscando iluminado mi equipo con "Ese no es el origen del error. DATEADD nunca va a ser capaz de añadir 3 miles de millones de segundos en 1970. Así que tal vez se dividen de nuevo y trate de añadir, por minutos, si sólo se preocupan de la fecha, segundo nivel de precisión no debe ser importante. Se puede proporcionar un par de valores de la muestra para los TS y los resultados esperados por aquellos". Para convertir el UNIXTIMESTAMP en los DÍAS por divinding para 60*60*1000*24
Salvatore Bonanno

@SalvatoreBonanno Pero que sigue siendo una forma extremadamente ineficiente para resolver el problema. Desea que la matemática en el otro lado de la cláusula where, confía en mí. A menos que el TS la columna no está indexado y usted sabe que es un hecho que nunca index.
Aaron Bertrand

Sí, vi la solución con la tabla temporal. La más problemática de las cosas es que solo puedo tener acceso de lectura a la tabla ( la tabla está en la nube) así que yo no sé nada sobre el índice en ella (podría ser un punto de vista demasiado!) . Por lo que el problema de matemáticas resuelto el problema por ahora, pero voy a intentar optimizado como se dijo arriba.
Salvatore Bonanno
-1

Yo repro había en mi local ADF medio ambiente, y fue capaz de obtener los resultados con éxito.

Abajo está la tabla de ejemplo:

Aquí, tengo 3 filas con la fecha '2021-11-23' y 2 filas de '2021-11-24'. TS la columna tiene una fecha en formato timestamp de UNIX y el dt_format la columna es mostrar la TS columna en el formato de la fecha.

enter image description here

ADF:

Usando la Búsqueda de la actividad, obtener el recuento de filas donde TS columna tiene la fecha de hoy. (Estoy usando tu código con una tabla diferente).

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

Salida:

enter image description here

2021-11-23 15:28:21

En otros idiomas

Esta página está en otros idiomas

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