Azure ADF Erreur de dépassement de capacité Arithmétique erreur expression de conversion de type de données int

0

La question

Je travaille avec azure ADF et je vais avoir des problèmes lorsque j'exécute cette requête sur 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 sortie est une erreur

Dépassement de capacité arithmétique

mais si je change le = pour un >=, la requête fonctionne et renvoie une sortie.

L' TS est un UNIXTIMESTAMP comme 1637680012264.

À l'aide de la combinaison de >= et < n'est pas ok, car je suis pas contigus jours (j'ai besoin d'utiliser WHERE TS IN (date1, date2, etc...)

Quelqu'un pourrait-il m'aider? Merci d'avance

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

La meilleure réponse

0

De préférence, je voudrais changer la table pour stocker les datetime2 les valeurs au lieu de alambiqué époque de la camelote.

Mais, en supposant que vous ne pouvez pas résoudre le design...

Pour Larnu point, vous ne voulez pas appliquer les calculs de la colonne, et vous ne voulez certainement pas à s'appliquer FORMAT() des deux côtés, parce que FORMAT() est un absolu chien.

Au lieu de cela, je voudrais trouver les limites pour aujourd'hui, et d'utiliser une plage ouverte. Ceci suppose que l' TS la colonne doit être 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;

Cela évite toute mise en forme de la surcharge, compliquées et inutiles convertir des expressions (TS doit déjà être un bigint, droit, alors pourquoi explicite CONVERT()?).


Si vous avez besoin non contigus dates, ok, on peut encore accomplir cela avec beaucoup moins d'abus de la table. Il suffit de créer une table #temp ou une variable de table avec des colonnes calculées, insérez vos dates multiples, et puis jointure externe pour elle.

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;

Beaucoup plus sur la date de mauvaises habitudes et pratiques exemplaires:

2021-11-23 15:46:34

Merci Aaron, même si votre solution n'est pas ce que je cherchais, vous avez illuminé mon équipe "ce n'est pas la source de l'erreur. DATEADD ne sera jamais en mesure d'ajouter 3 milliards de secondes à 1970. Donc peut-être de diviser à nouveau et essayez d'ajouter en quelques minutes, si vous ne se soucient que de la date, deuxième niveau de précision ne devrait pas être important. Pouvez-vous donner quelques exemples de valeurs pour TS et les résultats attendus pour les personnes". Donc converti le UNIXTIMESTAMP en JOURS par divinding pour 60*60*1000*24
Salvatore Bonanno

@SalvatoreBonanno Mais c'est toujours une très inefficace pour résoudre le problème. Vous voulez que les mathématiques de l'autre côté de la clause where, faites-moi confiance. À moins que le TS la colonne n'est pas indexé et vous savez pour un fait, vous n'aurez plus jamais de les indexer.
Aaron Bertrand

Yep, j'ai vu la solution avec la table temp. Le plus problématique genre de choses est que je ne peux avoir accès en lecture à la table ( la table est sur le cloud), donc je ne sais rien à propos de l'index sur elle (elle pourrait être vue aussi!) . Ainsi, le problème de mathématiques à résoudre le problème pour l'instant, mais je vais essayer d'optimiser ce que vous avez dit jusqu'.
Salvatore Bonanno
-1

Je repro avais dans mon local de l'ADF environnement et a été en mesure d'obtenir les résultats avec succès.

Ci-dessous l' exemple de table:

Ici, j'ai 3 lignes avec la date"2021-11-23’ et 2 lignes de"2021-11-24’. TS colonne a une date en timestamp UNIX format et le dt_format la colonne est de montrer le TS colonne de format de date.

enter image description here

ADF:

À l'aide de Recherche de l'activité, d'obtenir le nombre de lignes où TS colonne a la date d'aujourd'hui. (Je suis en utilisant votre code avec une autre table).

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

Sortie:

enter image description here

2021-11-23 15:28:21

Dans d'autres langues

Cette page est dans d'autres langues

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