Azure ADF Hatası Aritmetik taşma hatası ifadeyi veri türüne dönüştürme int

0

Soru

Azure ADF ile çalışıyorum ve bu sorguyu azure ADF'DE çalıştırdığımda sorun yaşıyorum:

SELECT COUNT(*) AS c
FROM TABLE 
WHERE CONVERT(date, (FORMAT(DATEADD(second, CONVERT(bigint, TS) / 1000, '19700101'), 'yyyy-MM-dd'))) = CONVERT(Date, GETDATE())

Çıktı bir hatadır

Aritmetik taşma

ama değiştirirsem = bir için >=, sorgu çalışır ve bir çıktı döndürür.

Bu TS is a UNIXTIMESTAMP hoşlanmak 1637680012264.

Kombinasyonunu kullanarak >= ve < tamam değil çünkü bitişik olmayan günlerle uğraşıyorum (kullanmam gerekiyor WHERE TS IN (date1, date2, etc...)

Biri bana yardım edebilir mi? Şimdiden teşekkür ederiz

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

En iyi cevabı

0

Tercihen, tabloyu saklamak için değiştirirdim datetime2 kıvrımlı dönem çöpü yerine değerler.

Ancak, tasarımı düzeltemeyeceğinizi varsayarsak...

Larnu'nun noktasına göre, hesaplamaları sütuna uygulamak istemezsiniz ve kesinlikle uygulamak istemezsiniz FORMAT() her iki tarafa da çünküFORMAT() mutlak bir köpektir.

Bunun yerine, bugün için sınırları bulup açık uçlu bir aralık kullanırdım. Bu varsayar TS sütun olmalıdır 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;

Bu, biçimlendirme ek yükünü, kıvrık ve gereksiz dönüştürme ifadelerini önler (TS zaten bir olmalı bigint doğru, öyleyse neden açık CONVERT()?).


Bitişik olmayan tarihlere ihtiyacınız varsa, tamam, bunu tablonun çok daha az kötüye kullanılmasıyla başarabiliriz. Hesaplanan sütunlarla bir #temp tablosu veya tablo değişkeni oluşturun, birden çok tarihinizi oraya ekleyin ve ardından dış birleşim yapın.

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;

Kötü alışkanlıklar ve en iyi uygulamalar hakkında çok daha fazlası:

2021-11-23 15:46:34

Teşekkürler Aaron, çözümün aradığım şey olmasa da ekibimi "Hatanın kaynağı bu değil" ile aydınlattın. DATEADD 1970'e asla 3 milyar saniye ekleyemeyecek. Belki tekrar bölün ve dakikalara göre eklemeyi deneyin, eğer sadece tarihi önemsiyorsanız, ikinci seviye doğruluk önemli olmamalıdır. TS için birkaç örnek değer ve bunlar için beklenen sonuçları sağlayabilir misiniz". Bu yüzden UNİXTİMESTAMP'I BİRKAÇ GÜN içinde divinding yaparak dönüştürdüm 60*60*1000*24
Salvatore Bonanno

@ SalvatoreBonanno Ama bu sorunu çözmek için hala son derece verimsiz bir yol. Matematiğin where cümlesinin diğer tarafında olmasını istiyorsun, güven bana. Sürece TS sütun dizine eklenmez ve hiçbir zaman dizine eklemeyeceğinizi bilirsiniz.
Aaron Bertrand

Evet, geçici tablonun çözümünü gördüm. En sorunlu şey, yalnızca tabloya okuma erişimine sahip olabilmemdir (tablo bulutta), bu yüzden üzerinde dizin hakkında hiçbir şey bilmiyorum (bu da bir görünüm olabilir!) . Bu yüzden matematik problemi şimdilik sorunu çözdü, ama söylediğin gibi optimize etmeye çalışacağım.
Salvatore Bonanno
-1

Yerel ADF ortamımda yeniden giriş yaptım ve sonuçları başarıyla alabildim.

Aşağıda örnek tablo verilmiştir:

Burada ‘2021-11-23’ tarihine sahip 3 satırım ve ‘2021-11-24 ' tarihinden itibaren 2 satırım var. TS sütunun UNİX zaman damgası biçiminde bir tarihi vardır ve dt_format sütun göstermek için TS tarih biçiminde sütun.

enter image description here

ADF:

Arama etkinliğini kullanarak, TH sütununun bugünün tarihine sahip olduğu satır sayısını alın. (Kodunuzu farklı bir tabloyla kullanıyorum).

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

Çıktı:

enter image description here

2021-11-23 15:28:21

Diğer dillerde

Bu sayfa diğer dillerde

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