Azure ADF de Erro erro de excesso Aritmético converter expressão para tipo de dados int

0

Pergunta

Eu estou trabalhando com azure ADF e estou tendo problemas quando executar esta consulta no 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())

A saída é um erro

De estouro de capacidade aritmética

mas se eu mudar o = para um >=, funciona a consulta e retorna uma saída.

O TS é um UNIXTIMESTAMP como 1637680012264.

Usando a combinação de >= e < não está ok porque eu estou lidando com não contíguos dias (eu preciso para usar WHERE TS IN (date1, date2, etc...)

Alguém poderia me ajudar? Obrigado antecipadamente

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

Melhor resposta

0

De preferência, eu gostaria de alterar a tabela para armazenar datetime2 valores em vez de complicada época de lixo.

Mas, supondo que você não pode corrigir o design...

Para Larnu ponto, você não deseja aplicar cálculos para a coluna, e você definitivamente não deseja aplicar FORMAT() para ambos os lados, porque FORMAT() é um absoluto cão.

Em vez disso, eu gostaria de encontrar os limites para os dias de hoje, e usar um intervalo ilimitado. Isso pressupõe que o TS coluna deve 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;

Isso evita qualquer tipo de formatação sobrecarga, complicado e desnecessário converter expressões (TS já deve ser um bigint, bem, então por que o explícito CONVERT()?).


Se você precisa de datas não-contíguas, ok, ainda podemos fazer isso com muito menos o abuso da mesa. Basta criar uma tabela #temp ou a variável de tabela com colunas calculadas, insira suas datas de lá e, em seguida, associação externa a ele.

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;

Muito mais na data de maus hábitos e práticas recomendadas:

2021-11-23 15:46:34

Graças a Arão, mesmo que a sua solução não é o que eu estava olhando para você iluminou minha equipe com o "Que não é a origem do erro. DATEADD nunca vai ser capaz de adicionar 3 bilhões segundos para 1970. Talvez por isso dividem-se novamente e tente adicionar minutos, se você só se preocupar com a data, segundo o nível de precisão não deve ser importante. Você pode fornecer um par de valores de exemplo para o TS e resultados esperados por aqueles". Então convertido a UNIXTIMESTAMP em DIAS por divinding para 60*60*1000*24
Salvatore Bonanno

@SalvatoreBonanno Mas que ainda é extremamente ineficiente forma de resolver o problema. Você deseja que a matemática do outro lado da cláusula where, confie em mim. A menos que o TS a coluna não é indexado e você sabe para um fato que você nunca vai indexá-lo.
Aaron Bertrand

Sim, eu vi a solução com a tabela temporária. O mais problemático coisas é que eu só posso ter acesso de leitura para a tabela ( a tabela está na nuvem), então eu não sei nada sobre o índice (que pode ser vista também!) . Assim, o problema de matemática resolveu o problema agora, mas eu vou tentar otimizado é como você disse acima.
Salvatore Bonanno
-1

Eu repro d em meu local ADF ambiente e foi capaz de obter os resultados com êxito.

Abaixo está a tabela de exemplo:

Aqui, eu tenho 3 linhas com a data"2021-11-23' e 2 linhas de '2021-11-24'. TS a coluna tem uma data no UNIX formato de carimbo de hora e o dt_format a coluna é mostrar o TS coluna em formato de data.

enter image description here

ADF:

Usando a Pesquisa de atividade, obtendo-se a contagem de linhas onde TS coluna tem data de hoje. (Eu estou usando o seu código com uma tabela 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

Saída:

enter image description here

2021-11-23 15:28:21

Em outros idiomas

Esta página está em outros idiomas

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