sql >> Database >  >> RDS >> Oracle

Hoe kan ik verschil z/w TIMESTAMP formaat waarden in Oracle vinden?

Het resultaat van tijdstempelberekeningen is een INTERVAL-gegevenstype. Je hebt daar een INTERVALDAG OM TWEEDE...

Als u het aantal minuten wilt, kunt u op één manier EXTRACT() . gebruiken , bijvoorbeeld:

select extract( minute from interval_difference ) * 60 
        + extract( hour from interval_difference ) * 60
        + extract( day from interval_difference ) * 60 * 24
  from ( select systimestamp - (systimestamp - 1) as interval_difference
           from dual )

Je kunt ook een truc met datums gebruiken:

select sysdate + (interval_difference * 1440) - sysdate
  from (select systimestamp - (systimestamp - 1) as interval_difference
          from dual )

De "truc"-versie werkt vanwege de volgorde van prioriteit van de operator en de verschillen tussen rekenkunde voor datum en tijdstempel.

Aanvankelijk ziet de operatie er als volgt uit:

date + ( interval * number ) - date

Zoals vermeld in de documentatie:

Oracle evalueert uitdrukkingen tussen haakjes voordat ze die erbuiten evalueert.

Dus de eerste bewerking voerde het uit om het interval met 1440 te vermenigvuldigen. Een interval, d.w.z. een discrete tijdsperiode, vermenigvuldigd met een getal, is een andere discrete tijdsperiode, zie de documentatie over datetime en intervalberekening. Het resultaat van deze bewerking is dus een interval, waardoor we achterblijven met:

date + interval - date

De plus-operator heeft hier voorrang op de min. De reden hiervoor kan zijn dat een interval minus een datum een ​​ongeldige bewerking is, maar de documentatie suggereert ook dat dit het geval is (komt er niet uit en zegt het). De eerste uitgevoerde bewerking is dus datum + interval. Een datum plus een interval is een datum. Vertrek gewoon

date - date

Volgens de documentatie resulteert dit in een geheel getal dat het aantal dagen vertegenwoordigt. Je hebt het oorspronkelijke interval echter vermenigvuldigd met 1.440, dus dit is nu 1.440 keer het aantal dagen dat het anders zou hebben. U houdt dan het aantal seconden over.

Het is vermeldenswaard dat:

Wanneer intervalberekeningen een datetime-waarde retourneren, moet het resultaat een werkelijke datetime-waarde zijn, anders retourneert de database een fout. De volgende twee instructies geven bijvoorbeeld fouten terug:

De "truc"-methode zal mislukken, zelden, maar het zal nog steeds mislukken. Zoals altijd is het het beste om het goed te doen.



  1. SQL RANK() versus ROW_NUMBER()

  2. Hoe leeftijd in jaren, maanden en dagen te krijgen met Oracle

  3. 8 functies om de dag te retourneren vanaf een datum in MariaDB

  4. Postgres wijzigt handmatig de volgorde