Azure ADF Chyba Aritmetického pretečenie chybu prevod prejavu dátový typ int

0

Otázka

Pracujem s azure ADF a mám problémy, keď som sa spustiť 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é pretečeniu

ale ak by som zmeniť = na >=dotaz funguje a vracia výstup.

Na TS je UNIXTIMESTAMP ako 1637680012264.

Pomocou kombinácie >= a < nie je v poriadku, pretože som sa zaoberajú nie súvislých dní (musím použiť WHERE TS IN (date1, date2, etc...)

Mohol by mi niekto pomôcť? Vďaka vopred

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

Najlepšiu odpoveď

0

Prednostne by som zmeniť tabuľke store datetime2 hodnoty namiesto spletitý doby nevyžiadanej pošty.

Ale, za predpokladu, že si nemôžete opraviť dizajn...

Na Larnu je bod, nechcete aplikovať výpočty na stĺpec, a určite nechcú, aby sa vzťahujú FORMAT() na oboch stranách, pretože FORMAT() je absolútne psa.

Namiesto toho, by som nájsť hranice pre dnes, a používanie otvoreného rozsahu. To predpokladá, že TS stĺpec musí byť 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 sa zabráni akékoľvek formátovanie réžii, spletitý a zbytočné previesť výrazy (TS už musí byť bigint, právo, tak prečo explicitné CONVERT()?).


Ak potrebujete nesúvislých dátumy, ok, ešte môžeme dosiahnuť s ďaleko menej zneužívania tabuľky. Stačí vytvoriť #temp tabuľku alebo premenná s vypočítané stĺpce, vložte vaše viaceré dátumy tam, a potom vonkajšie pripojiť sa k nej.

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;

Veľa viac na dátum zlé návyky & najlepších postupov:

2021-11-23 15:46:34

Vďaka Árona, aj keď vaše riešenie to nie je to, čo som hľadal si osvetlené môj tím s ", Ktoré nie je zdrojom chýb. DATEADD je nikdy nebude môcť pridať 3 miliardy sekúnd 1970. Takže možno rozdeliť opäť a skúste pridať do pár minút, ak sa stará len o dátum, druhej úrovne presnosti by nemali byť dôležité. Môžete poskytnúť niekoľko hodnôt vzoriek pre TS a očakávané výsledky pre tých". Tak skonvertuje UNIXTIMESTAMP v DŇOCH od divinding pre 60*60*1000*24
Salvatore Bonanno

@SalvatoreBonanno, Ale je to ešte veľmi neefektívne riešiť problém. Chcete matematika na druhej strane ak klauzula, ver mi. Pokiaľ TS stĺpec nie je indexované a viete skutočnosti ste nikdy index to.
Aaron Bertrand

Áno, videl som riešenie s temp tabuľke. Najviac problematické veci je, že môžem mať iba prístup pre čítanie do tabuľky ( tabuľka je na cloud) tak ja neviem nič o index na to (to by mohol byť pohľad príliš!) . Takže matematický problém vyriešil problém teraz, ale budem sa snažiť, aby optimalizované to, ako si povedal hore.
Salvatore Bonanno
-1

Som repro by v mojej miestnej ADF prostredie a bol schopný sa dostať výsledky úspešne.

Nižšie je vzorka tabuľka:

Tu, mám 3 riadky s dátumom '2021-11-23"a 2 riadky z '2021-11-24'. TS stĺpec má dátum v UNIX timestamp format a dt_format stĺpec je ukázať TS stĺpec formát dátumu.

enter image description here

ADF:

Pomocou Vyhľadávania činnosti, získanie počet riadkov, kde TS stĺpec má dnešný dátum. (Som pomocou kódu s inou tabuľka).

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 iných jazykoch

Táto stránka je v iných jazykoch

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