Azure ADF Errore errore di overflow Aritmetico conversione di espressione per il tipo di dati int

0

Domanda

Sto lavorando con azure ADF e sto avendo problemi quando eseguire questa query su 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())

L'output è un errore

Overflow aritmetico

ma se cambio il = per un >=la query funziona e restituisce un output.

Il TS è un UNIXTIMESTAMP come 1637680012264.

Utilizzando la combinazione di >= e < non è ok, perché ho a che fare con non contigui giorni (ho bisogno di utilizzare WHERE TS IN (date1, date2, etc...)

Qualcuno potrebbe aiutarmi? Grazie in anticipo

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

Migliore risposta

0

Preferibilmente, vorrei cambiare la tabella per memorizzare datetime2 i valori invece di contorto epoca spazzatura.

Ma, ammesso che non è possibile risolvere il design...

Per Larnu punto, non si desidera applicare i calcoli in colonna, e sicuramente non si desidera applicare FORMAT() per entrambe le parti in quanto FORMAT() è un assoluto cane.

Invece, vorrei trovare i confini di oggi, e l'uso di un open-ended gamma. Questo presuppone che il TS la colonna deve essere 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;

Questo evita qualsiasi tipo di formattazione overhead, contorto e inutili convertire espressioni (TS deve essere già un bigint, a destra, allora, perché l'esplicito CONVERT()?).


Se hai bisogno di non contigue date, ok, possiamo tuttavia fare questo con molto meno di abuso del tavolo. Basta creare una tabella #temp o una variabile di tabella con le colonne calcolate, inserisci la tua più date in là, e poi join esterno ad esso.

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;

Un sacco di più sulla data di cattive abitudini e buone pratiche:

2021-11-23 15:46:34

Grazie Aaron, anche se la soluzione non è quello che cercavo, hai illuminato la mia squadra con "non è l'origine dell'errore. DATEADD non sta andando mai essere in grado di aggiungere 3 miliardi di secondi al 1970. Così forse dividere di nuovo e provare l'aggiunta di minuti, se si cura solo la data, secondo livello di precisione non dovrebbe essere importante. Si può avere un paio di valori di esempio per TS e risultati attesi per quelli". Così convertito il UNIXTIMESTAMP in GIORNI da divinding per 60*60*1000*24
Salvatore Bonanno

@SalvatoreBonanno Ma ancora estremamente inefficiente modo per risolvere il problema. Si desidera che la matematica sull'altro lato della clausola where, fidati di me. A meno che il TS la colonna non è indicizzato e si sa per certo è mai indice di essa.
Aaron Bertrand

Sì, ho visto la soluzione con la tabella temporanea. Più problematico è roba che posso avere solo l'accesso in lettura alla tabella ( la tabella è nel cloud), quindi non so nulla di indice (potrebbe essere una visione troppo!) . Quindi, il problema di matematica risolto il problema per ora, ma cercherò di ottimizzato come hai detto.
Salvatore Bonanno
-1

Ho repro avevo nel mio locale ADF ambiente e stato in grado di ottenere risultati di successo.

Di seguito la tabella di esempio:

Qui, ho 3 righe con la data"2021-11-23’ e 2 righe ‘2021-11-24’. TS colonna ha una data in formato UNIX timestamp e il dt_format la colonna è di mostrare l' TS colonna in formato data.

enter image description here

ADF:

Utilizzo di attività di Ricerca, di ottenere il numero di righe in cui TS colonna ha la data di oggi. (Sto usando il tuo codice con un altro tavolo).

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

Output:

enter image description here

2021-11-23 15:28:21

In altre lingue

Questa pagina è in altre lingue

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