sql >> Databasteknik >  >> RDS >> Oracle

Hur hittar man skillnaden i svartvitt TIMESTAMP-format i Oracle?

Resultatet av tidsstämpelaritmetiken är en INTERVAL-datatyp. Du har en INTERVALDAG TILL ANDRA där...

Om du vill ha antalet minuter skulle ett sätt vara att använda EXTRACT() , till exempel:

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 )

Alternativt kan du använda ett trick med datum:

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

"Trick"-versionen fungerar på grund av operatorns prioritetsordning och skillnaderna mellan aritmetiken för datum och tidsstämpel.

Till en början ser operationen ut så här:

date + ( interval * number ) - date

Som nämnts i dokumentationen:

Oracle utvärderar uttryck inom parentes innan de utvärderas utanför.

Så den första operationen utförde den för att multiplicera intervallet med 1 440. Ett intervall, d.v.s. en diskret tidsperiod, multiplicerad med ett tal är en annan diskret tidsperiod, se dokumentationen om datumtid och intervallaritmetik. Så resultatet av denna operation är ett intervall som lämnar oss med:

date + interval - date

Plusoperatorn har företräde framför minus här. Anledningen till detta kan vara att ett intervall minus ett datum är en ogiltig operation, men dokumentationen antyder också att så är fallet (kommer inte ut och säger det). Så den första operationen som utförs är datum + intervall. Ett datum plus ett intervall är ett datum. Lämnar bara

date - date

Enligt dokumentationen resulterar detta i ett heltal som representerar antalet dagar. Men du multiplicerade det ursprungliga intervallet med 1 440, så detta representerade nu 1 440 gånger antalet dagar det annars skulle ha. Du har sedan antalet sekunder kvar.

Det är värt att notera att:

När intervallberäkningar returnerar ett datetime-värde måste resultatet vara ett faktiskt datetime-värde eller så returnerar databasen ett fel. Till exempel returnerar de två följande satserna fel:

"Knep"-metoden kommer misslyckas, sällan men det kommer fortfarande att misslyckas. Som alltid är det bäst att göra det ordentligt.



  1. Vilken SQL-fråga är snabbare? Filtrera på Join-kriterier eller Where-klausul?

  2. Hur man löser det saknade uttrycket i ORA-00936

  3. Hur man ställer in navigeringsformuläret som standardformulär i Microsoft Access

  4. MySQL Performance – 5 parametrar från konfigurationsfilen