SUM COLUMN STRING JAK DATA - wyrocznia


1

Moja kolumna TIME_AVG ma wartość STRING w Oracle, muszę sumować SUMĘ (TIME_AVG) do DATE, ale kolumna DATE akceptuje tylko do 23:59:59 Jak to zrobić za pomocą zapytania w Oracle?

TIME_AVG
42:12:57
zerowy
98:31:06
20:16:12
04:00:31
05:18:39
05:18:06
50:09:12
22:59:27

Odpowiedzi:


0

Nie można zapisać wartości do DATEtypu danych o wartości godziny większej niż 24 godziny. Jeśli chcesz przechowywać czasy, które mogą przekraczać jeden dzień, powinieneś użyć typu INTERVALdanych.

Ponieważ nie można natywnie sumować INTERVALtypów danych w Oracle, podzieliłbym ciągi na godziny, minuty i sekundy, sumując całkowitą liczbę sekund dla każdego rekordu, a następnie sumując tę ​​wartość dla każdego rekordu, zanim przedstawię go jako INTERVAL:

SELECT
    NUMTODSINTERVAL(SUM((TO_NUMBER(SUBSTR(TIME_AVG,1,2))*3600)+(TO_NUMBER(SUBSTR(TIME_AVG,4,2))*60)+TO_NUMBER(SUBSTR(TIME_AVG,7,2))), 'second')
FROM table
WHERE TIME_AVG IS NOT NULL

W przypadku wartości podanych w pytaniu daje to 10 dni, 8 godzin, 46 minut i 10 sekund:

+000000010 08:46:10.000000000

Jeśli chcesz całkowicie odtworzyć prezentację hh: mm: ss z oryginalnych danych, możesz:

SELECT    
    TO_CHAR(FLOOR(SUM((TO_NUMBER(SUBSTR(TIME_AVG,1,2))*3600)+(TO_NUMBER(SUBSTR(TIME_AVG,4,2))*60)+TO_NUMBER(SUBSTR(TIME_AVG,7,2)))/3600)) || ':' ||
    TO_CHAR(FLOOR(MOD(SUM((TO_NUMBER(SUBSTR(TIME_AVG,1,2))*3600)+(TO_NUMBER(SUBSTR(TIME_AVG,4,2))*60)+TO_NUMBER(SUBSTR(TIME_AVG,7,2))),3600)/60)) || ':' ||
    TO_CHAR(MOD(SUM((TO_NUMBER(SUBSTR(TIME_AVG,1,2))*3600)+(TO_NUMBER(SUBSTR(TIME_AVG,4,2))*60)+TO_NUMBER(SUBSTR(TIME_AVG,7,2))),60))
FROM table
WHERE TIME_AVG IS NOT NULL

co daje wynik:

248:46:10

Jeśli naprawdę, naprawdę, naprawdę musisz zapisać wynik w polu DATE, przypuszczam, że możesz go zapisać względem Epoki (1970-01-01):

SELECT
    TO_CHAR(TO_DATE('1-1-1970 00:00:00','DD-MM-YYYY HH24:Mi:SS') + (SUM((TO_NUMBER(SUBSTR(TIME_AVG,1,2))*3600)+(TO_NUMBER(SUBSTR(TIME_AVG,4,2))*60)+TO_NUMBER(SUBSTR(TIME_AVG,7,2)))/86400), 'YYYY-MM-DD HH24:Mi:SS')
FROM table
WHERE TIME_AVG IS NOT NULL

co daje wynik:

1970-01-11 08:46:10
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.