Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Oracle sqlOdejmowanie między dwiema datami

Zakładam, że to zadanie domowe, więc kilka wskazówek...

Po pierwsze, nigdy nie przechowuj dat jako varchar , spowoduje to wiele problemów Tobie i optymalizatorowi.

Po drugie, date Oracle typ danych może być przechowywany tylko z dokładnością co do sekundy, a ciąg ma ułamki sekundy, więc patrzysz na timestamp zamiast date . Możesz przekonwertować swój ciąg na znacznik czasu za pomocą to_timestamp() funkcji, przekazując odpowiednią maskę formatu . OK, czuję się hojnie:

select to_timestamp(start_date, 'DD-Mon-RR HH.MI.SS.FF9 AM') from your_table;

Po trzecie, odjęcie dwóch znaczników czasu da Ci interval typ danych, z którego będziesz musiał wyodrębnić żądane informacje w czytelnym formacie. Przeszukaj tę lub gdzie indziej witrynę, aby znaleźć odejmowanie znaczników czasu, ale wskażę Ci ten ostatni jako próbka.

Średnia jest nieco trudniejsza, więc możesz chcieć przekonwertować swoje interwały na liczby; ponownie wyszukaj poprzednie pytania, takie jak to . Rozmiar interwałów, precyzja, na której Ci zależy, sposób, w jaki chcesz sformatować dane wyjściowe itp., będą miały pewien wpływ na podejście, które chcesz przyjąć.

Jeśli potrzebujesz przybliżonego wyniku, odpowiedź @Joachima Isakssona da ci to - „w przybliżeniu” z powodu zaokrąglania; na przykład czas trwania krótszy niż sekunda będzie wyświetlany jako zero. Ten sam efekt można zaobserwować w przypadku znaczników czasu oddanych do dat, które również tracą ułamki sekund:

select 24*60*60*avg(
    cast(to_timestamp(step_ending_time, 'DD-Mon-RR HH.MI.SS.FF9 AM') as date)
        - cast(to_timestamp(step_starting_time, 'DD-Mon-RR HH.MI.SS.FF9 AM') as date)
    ) as avg_duration
from process_audit;

Bardziej dokładną odpowiedź można znaleźć, wyodrębniając różne elementy znaczników czasu, tak jak w pytaniu, do którego połączyłem się wcześniej. Możesz nie potrzebować ich wszystkich, jeśli wiesz, że czasy trwania są zawsze krótsze niż godzina, ale jeśli potrzebujesz więcej niż jednego (tj. Jeśli czas trwania może być dłuższy niż minuta), użycie pośredniego wspólnego wyrażenia tabelarycznego upraszcza rzeczy bit:

with cte as (
    select to_timestamp(step_ending_time, 'DD-Mon-RR HH.MI.SS.FF9 AM')
        - to_timestamp(step_starting_time, 'DD-Mon-RR HH.MI.SS.FF9 AM') as duration
    from process_audit
)
select avg(extract(second from duration)
    + extract(minute from duration) * 60
    + extract(hour from duration) * 60 * 60
    + extract(day from duration) * 60 * 60 * 24) as avg_duration
from cte;

W przypadku dwóch przykładowych wierszy, jednego z przerwą wynoszącą dokładnie sekundę, a drugiego z dokładnie 1,5 sekundy, daje to wynik 1.25 .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. utrzymywanie jednego połączenia z DB lub otwieranie zamykania na żądanie

  2. Wybierz drugą najbardziej minimalną wartość w Oracle

  3. 2PL, model rygorystyczny kontra ścisły, czy jest jakaś korzyść?

  4. Oracle help brak przecinka

  5. Ogranicz limit czasu połączenia dla bazy danych Oracle