sql >> Database >  >> RDS >> Oracle

SQL:Is het mogelijk om velden van het type INTERVAL te SOM()?

Ik ben bang dat je pech gaat hebben met een oplossing die zowel in Oracle als MSSQL werkt. Datumberekening is iets dat heel anders is bij de verschillende smaken van DBMS.

Hoe dan ook, in Oracle kunnen we datums gebruiken in eenvoudige rekenkunde. En we hebben een functie NUMTODSINTERVAL die een getal verandert in een DAY TO SECOND INTERVAL. Dus laten we ze samenvoegen.

Eenvoudige testgegevens, twee rijen met datumparen met een tussenpoos van twaalf uur:

SQL> alter session set nls_date_format = 'dd-mon-yyyy hh24:mi:ss'
  2  /

Session altered.

SQL> select * from t42
  2  /

D1                   D2
-------------------- --------------------
27-jul-2010 12:10:26 27-jul-2010 00:00:00
28-jul-2010 12:10:39 28-jul-2010 00:00:00

SQL>

Eenvoudige SQL-query om de som van de verstreken tijd te vinden:

SQL> select numtodsinterval(sum(d1-d2), 'DAY')
  2  from t42
  3  /

NUMTODSINTERVAL(SUM(D1-D2),'DAY')
-----------------------------------------------------
+000000001 00:21:04.999999999

SQL>

Iets meer dan een dag, dat is wat we zouden verwachten.

Werken met TIMESTAMP-kolommen is iets omslachtiger, maar we kunnen nog steeds dezelfde truc uithalen.

In het volgende voorbeeld. T42T is hetzelfde als T42, alleen hebben de kolommen TIMESTAMP in plaats van DATE als datatype. De query extraheert de verschillende componenten van de DS INTERVAL en zet ze om in seconden, die vervolgens worden opgeteld en weer omgezet in een INTERVAL:

SQL> select numtodsinterval(
  2              sum(
  3                  extract (day from (t1-t2)) * 86400
  4                   + extract (hour from (t1-t2)) * 3600
  5                   + extract (minute from (t1-t2)) * 600
  6                   + extract (second from (t1-t2))
  7            ), 'SECOND')
  8  from t42t
  9  /

NUMTODSINTERVAL(SUM(EXTRACT(DAYFROM(T1-T2))*86400+EXTRACT(HOURFROM(T1-T2))*
---------------------------------------------------------------------------
+000000001 03:21:05.000000000

SQL>

Dit resultaat is tenminste in ronde seconden!



  1. Retourneer rijen in de exacte volgorde waarin ze zijn ingevoegd

  2. Hoe zou u de variantie van gegevensvariabelen op een gemeenschappelijk schema modelleren? SQL

  3. Op zoek naar een tutorial over het bouwen van een privéberichtensysteem met behulp van PHP

  4. SQL Inner join op geselecteerde instructies