Azure ADF Chyba chyba přetečení Aritmetické převod výraz na datový typ int

0

Otázka

Pracuji s azure ADF a mám problémy, když jsem spustit tento dotaz na 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())

Výstup je chyba

Aritmetické přetečení

ale pokud změním = na >=dotaz funguje a vrací výstup.

Na TS je UNIXTIMESTAMP jako 1637680012264.

Pomocí kombinace >= a < není v pořádku, protože se potýkám s není souvislé dny (musím použít WHERE TS IN (date1, date2, etc...)

Mohl by mi někdo pomoci? Díky předem

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

Nejlepší odpověď

0

Nejlépe bych změnit tabulky pro ukládání datetime2 hodnoty namísto spletité epocha nezdravé.

Ale, za předpokladu, že nemůžete opravit design...

Na Larnu je bod, nechcete aplikovat výpočty do kolony, a vy určitě nechcete použít FORMAT() na obou stranách, protože FORMAT() je absolutní psa.

Místo toho bych najít hranice pro dnes, a používat otevřený rozsah. To předpokládá, že TS sloupec musí být 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;

Tím se zabrání jakékoli formátování nad hlavou, spletitý a zbytečné převést výrazy (TS musí být již bigint, ne, tak proč explicitní CONVERT()?).


Pokud budete potřebovat non-sousedící data, ok, můžeme stále dosáhnout s daleko méně zneužívání tabulky. Stačí vytvořit #dočasná tabulka nebo tabulky proměnné s vypočítaného sloupce, vložit více dat v tam, a pak vnější spojení.

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;

Spousta více na rande špatné návyky & nejlepší praktiky:

2021-11-23 15:46:34

Díky Aaron, i když vaše řešení to není to, co jsem hledal, ty svítí můj tým s ", Které není zdrojem chyb. DATEADD je nikdy nebude moci přidat 3 miliardy sekund do roku 1970. Takže možná ještě jednou a zkuste přidat o pár minut, pokud jste jen péče o datum, druhé úrovně přesnosti by nemělo být důležité. Můžete poskytnout pár ukázkových hodnot pro TS a očekávané výsledky pro ty". Takže převeden UNIXTIMESTAMP ve DNECH od divinding pro 60*60*1000*24
Salvatore Bonanno

@SalvatoreBonanno Ale je to velmi neefektivní způsob, jak vyřešit problém. Chcete matematika na druhé straně, kde klauzule, věř mi. Pokud TS sloupec není indexován a víte, že ve skutečnosti jste nikdy indexu.
Aaron Bertrand

Jo, viděla jsem řešení s temp tabulky. Nejvíce problematické věci je, že jsem může mít pouze přístup pro čtení do tabulky ( tabulka je na cloud), takže nevím nic o index (může to být pohled!) . Takže matematický problém vyřešil problém pro teď, ale budu se snažit optimalizované to jak jste řekl.
Salvatore Bonanno
-1

Jsem repro bych v mé místní ADF prostředí a byl schopen získat výsledky, úspěšně.

Níže je ukázka tabulky:

Tady, mám 3 řádky s datem '2021-11-23a 2 řádky od '2021-11-24'. TS sloupec obsahuje datum ve formátu UNIX timestamp a dt_format sloupec je ukázat TS sloupec v formát data.

enter image description here

ADF:

Pomocí Vyhledávací činnosti, získání počtu řádků, kde TS sloupec má dnešní datum. (Já jsem s použitím vašeho kódu s jinou tabulkou).

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

Výstup:

enter image description here

2021-11-23 15:28:21

V jiných jazycích

Tato stránka je v jiných jazycích

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