Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.11.2013, 13:05   #1
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,442
Вопрос Oracle. Расчет врмени между 2я датами, как?

Доброго времени суток!

Надо найти разницу во времени между 2я датами:
А: 23.11.2013 09:03:14
Б: 21.11.2013 06:14:00

так чтобы получить разницу в днях часах минутах и секундах, т.е.
А - Б = 1 день 21 часов 11 минут N секунд.

Как это реализовать?

Сейчас пытаюсь получить какую-то разницу:
Код:
SELECT * FROM RRRR R WHERE 
  (
    TRUNC(
        MOD(
         (SYSDATE - R.DATETIMERECEIVE) * 86400, 3600
           )/60/60
         ) > 1
  )
Пример нашел в сети, прошу объяснить как он работает:
1. Что получается после вычитания, и почему оно домножается на 86400?
2. Что такое 3600?
3. Если я делю на 60, то записи выводятся т.к. подподают под условие > 1
4. Если я делю на 60 а затем ещё раз на 60, то записи НЕ выводятся.
Человек_Борща вне форума Ответить с цитированием
Старый 22.11.2013, 13:36   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

ну, во-первых, вы спрашиваете как получить разницу в днях, часах, минутах, а сами в примере ОТБИРАЕТЕ записи с определённой разностью Вам не кажется, что это разные вещи?!

во-вторых,
86400 - это 60*60*24 (60 секунду * 60 минут * 24 ) == число секунд в одних сутках
3600 - похоже, что это число секунд в часе

а вот дальше мне не понятно.
MOD (разница_в_секундах, 3600) даст нам количество секунд, остающихся в отстатке от деления разницы на 3600
если это число разделить на 60 - получим число минут
если число минут разделить на 60 получим число часов - но в данном случае всегда получим ноль часов (мы же уже взяли ОСТАТОК от деления на 3600)
Serge_Bliznykov вне форума Ответить с цитированием
Старый 22.11.2013, 13:39   #3
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

SYSDATE - R.DATETIMERECEIVE - разница в днях (1.23540003)
(SYSDATE - R.DATETIMERECEIVE) * 86400 - разница в секундах
MOD((SYSDATE - R.DATETIMERECEIVE) * 86400, 3600) - остаток от деления = секунды после отбрасывания целых часов

Как-то многоэтажно, чтобы получить 5 дн 13 ч 36 м 05 с:
Код:
TRUNC(SYSDATE-R.DATETIMERECEIVE) - разница в целых сутках (d)
TRUNC((SYSDATE-R.DATETIMERECEIVE-d)*86400) - остался остаток в секундах cекундах (s)
TRUNC(s/3600) - целое число часов в остатке
TRUNC(MOD(s,3600)/60) - целое число минут в остатке
MOD(s,3600) - целое число секунд в остатке
Если во WHERE лучше сразу анализировать на разницу в сек. Зачем там монстровидный анализ? Например
Код:
WHERE (SYSDATE - R.DATETIMERECEIVE) * 86400>100000
А вообще условие паршивое, медленное
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 22.11.2013 в 13:57.
Аватар вне форума Ответить с цитированием
Старый 22.11.2013, 14:37   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Аватар, + 1




я вот ещё ТУТ почитал...

получилась такая конструкция:
Код:
select trunc(d1-d2) || ' дней(я) ' || 
  EXTRACT(HOUR FROM NUMTODSINTERVAL((d1-d2),'HOUR')) || ' часа ' ||
  EXTRACT(MINUTE FROM NUMTODSINTERVAL((d1-d2)*1440,'MINUTE')) || ' мин ' ||
  TRUNC(EXTRACT(SECOND FROM NUMTODSINTERVAL((d1-d2)*86400,'SECOND'))) || ' сек ' 
from xxxxx

Человек_Борща
кстати,
Цитата:
Сообщение от Человек_Борща
А: 23.11.2013 09:03:14
Б: 21.11.2013 06:14:00
у меня получилась разница
2 дней(я) 2 часа 49 мин 14 сек
кто из нас ошибся?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 28.11.2013, 17:38   #5
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,442
По умолчанию

Цитата:
(SYSDATE - R.DATETIMERECEIVE) * 86400
Этого оказалось достаточно.
Все привести в секунды и сравнить, проще, чем нагромождать вычисления.

[QUOTE]у меня получилась разница
2 дней(я) 2 часа 49 мин 14 сек
кто из нас ошиб
Человек_Борща вне форума Ответить с цитированием
Старый 28.11.2013, 17:59   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Оптимальней запрос будет для
R.DATETIMERECEIVE>=какой-то даты-времени
Так индекс будет работать для поля DATETIMERECEIVE, если он есть вообще. Вариант, которого оказалось достаточно не оптимален - индекс не будет задействован. А какую-то дату-время можно вычислить на клиенте на основании текущей и смещения и встроить в запрос или передать параметром в хранимку
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 24.08.2017, 14:29   #7
tana_g
Новичок
Джуниор
 
Регистрация: 24.08.2017
Сообщений: 1
По умолчанию

--количество целых часов между началом и концом события
SELECT TRUNC(
MOD((to_date('03.06.2017 11:25:55','dd.mm.yyyy HH24:mi:ss') --конец дата время
-to_date('01.06.2017 19:05:46','dd.mm.yyyy HH24:mi:ss')) * 86400,0 --начало дата время
)/60/60
)
from dual
tana_g вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как в MS Excel рассчитать количество полных месяцев между двумя датами? moonlightchild Microsoft Office Excel 2 28.12.2012 13:20
найти разницу между двумя датами, а результат записать в письменном виде, так чтобы было согласование между падежами KatanaZh Microsoft Office Excel 15 27.11.2012 00:11
Как между двумя датами определить время бодрствования? Dux Общие вопросы Delphi 14 16.09.2010 14:41
Как задать интервал между датами в фильтре Леон Microsoft Office Access 2 22.10.2008 11:16
Расчет полей с датами и передачи строк в отчет. crem78 БД в Delphi 2 09.08.2008 12:07