Sustragerea marcajelor de timp teradata (Programare, Timestamp, Teradata)

user2862496 a intrebat.

Încerc să găsesc diferența dintre 2 timestamps în teradata. Folosesc următorul cod:

(date1-date2)day(4) to second  as time_diff

Acest lucru dă o eroare: Interval Field Overflow. Care ar putea fi motivul pentru asta? Există o altă modalitate de a calcula diferența dintre 2 timestamp-uri?

Și când folosesc acest lucru:

case when(((date2+ INTERVAL '72' hour )-date1) day(4) to second)>0 then '<72 hrs'

atunci eroarea pe care o primesc este Operațiune invalidă pentru DateTime sau IntervalVă rog să mă ajutați

2 răspunsuri
Rob Paller

Intervalul de DAY(4) TO SECOND(6) este -9999 23:59:59.999999 până la 9999 23:59:99.999999. Pentru comparație, puteți scădea 1987-01-01 00:00:00 din CURRENT_TIMESTAMP(0) și să vă încadrați în intervalul acceptabil de valori.

În cazul în care valorile de timp diferă cu mai mult de aproximativ 27,39 ani, va trebui să luați în considerare o turnare a valorilor la DATE mai întâi pentru a determina numărul de zile dintre cele două valori. Apoi, extrageți valorile timestamp-ului și comparați-le, ținând cont de faptul că una dintre ele ar putea să cadă în partea greșită a miezului nopții.

Jiri Hubacek

Cred că se datorează faptului că datele dvs. au fost prea departe una de cealaltă, astfel încât intervalul lor „day(4) to second” se depășește.

În scriptul atașat, testez dacă diferența este mai mare de un an. Dacă da, este evident că intervalul dintre date este mai mare de 72 de ore. În caz contrar, continui cu intervalul de ore. Anul are aproximativ 8,8k, așa că HOUR(4) este suficient de bun.

Date cu o diferență de 20 de ani

SELECT       CASE WHEN   EXTRACT ( YEAR FROM  ((TIMESTAMP '2000-01-01 00:00:00'+ INTERVAL '72' hour ) - (TIMESTAMP '2000-01-02 12:00:00'))YEAR(4) TO MONTH    )  !=  0 THEN '>72 hours' 
                    WHEN   EXTRACT ( YEAR FROM  ((TIMESTAMP '2000-01-01 00:00:00'+ INTERVAL '72' hour ) - (TIMESTAMP '2000-01-02 12:00:00'))YEAR(4) TO MONTH    ) = 0 THEN
                        CASE WHEN ((TIMESTAMP '2000-01-01 00:00:00'+ INTERVAL '72' hour ) - (TIMESTAMP '2000-01-02 12:00:00'))HOUR(4) < 72 THEN '< 72 hours' END
                 END

Date cu un decalaj de 1 zi

SELECT       CASE WHEN   EXTRACT ( YEAR FROM  ((TIMESTAMP '2000-01-01 00:00:00'+ INTERVAL '72' hour ) - (TIMESTAMP '2020-01-02 12:00:00'))YEAR(4) TO MONTH    )  !=  0 THEN '>72 hours' 
                    WHEN   EXTRACT ( YEAR FROM  ((TIMESTAMP '2000-01-01 00:00:00'+ INTERVAL '72' hour ) - (TIMESTAMP '2020-01-02 12:00:00'))YEAR(4) TO MONTH    ) = 0 THEN
                        CASE WHEN ((TIMESTAMP '2000-01-01 00:00:00'+ INTERVAL '72' hour ) - (TIMESTAMP '2020-01-02 12:00:00'))HOUR(4) < 72 THEN '< 72 hours' END
                 END

În mod clar, în scriptul dvs. ar trebui să înlocuiți TIMESTAMP „YYYY-MM-DD” cu „YYYY-MM-DD”.