Консультация № 169229
10.06.2009, 10:34
0.00 руб.
11.06.2009, 23:12
0 7 1
Напишите пожалуйста запрос для Oracle.

Поля таблицы: DataVxoda (тип дата-время), DataVyxoda (тип дата-время), Id (целое)

Известно конкретное Id.

Найти: количество минут проведенных в помещении в течении сегодняшнего дня- (DataVyxoda - DataVxoda) для конкретного Id.

Ограничения:
1. Количество входов и выходов в течении дня - неограничено.
2. Необходимо получать минуты с учетом того что человек возможно еще НЕ вышел, т.е. DataVyxoda is Null.
3. Записей в таблице много - примерно за месяц, для сотни человек.

Обсуждение

Неизвестный
10.06.2009, 15:22
общий
Это слишком сложный вопрос? Это вопрос не для курсовой, а для программы :(. Для MySQL я такое написать могу, а под Oracle не знаю функций работы с дата-полем... Помогите пожалуйста!
Неизвестный
11.06.2009, 23:04
общий
это ответ
Здравствуйте, LanK.
Можно например так:
Код:
SELECT ID, SUM(ROUND((DataVyxoda - DataVxoda)*1440)) DELTA_TIME  FROM MYTABLE
WHERE
DataVyxoda IS NOT NULL
AND
TO_DATE(DataVxoda) = TO_DATE(SYSDATE)
GROUP BY ID

расчет простой:
разность дат без форматирования возвращает относительный коэффициент, он же является множителем для единицы измерения
например:
для секунд - 86 400
для минут - 1 440
для часов - 24

величины берутся для суток.
таким образом, умножая на коэффициент минуты и округляя, мы получаем целое число минут (это справедливо и для часов и для секунд)

Если надо для всех данных - просто убрать второе условий и для группировки по дням в SELECT добавить TO_DATE(SYSDATE) и это же в группировку.. Для периода можно использовать BETWEEN
Неизвестный
15.06.2009, 15:00
общий
Расчет минут абсолютно верен, но... если поле DataVyxoda = Null минуты не считаются, т.е. естественно тоже равны Null
Неизвестный
15.06.2009, 15:31
общий
LanK:
но... если поле DataVyxoda = Null минуты не считаются

А как оно будет считать, если стоит условие отобрать все записи у которых дата = сегодня и дата выхода НЕ РОВНА НУЛЮ????
Вы что-то путаете, таких записей в выборке просто не будет, со значением NULL
Вы поставили условие - подсчитать тех людей, которые вышли.
Если Вам надо найти время и для тех кто еще не вышел - тогда просто примените функцию NVL и снимите условие DataVyxoda IS NOT NULL
Неизвестный
15.06.2009, 15:44
общий
Victor Pyrlik:
Цитата: 19206
у которых дата = сегодня
дата входа = сегодня. ограничение номер 2.
Цитата: 19206
Вы поставили условие - подсчитать тех людей, которые вышли.
да нет жевсё тоже ограничение 2:
Цитата: 5994
Необходимо получать минуты с учетом того что человек возможно еще НЕ вышел, т.е. DataVyxoda is Null
.

А что за функция NVL ? Я не знаю функций Oracle поэтому вопрос и задал :(.
Неизвестный
15.06.2009, 15:56
общий
LanK:
А что за функция NVL ? Я не знаю функций Oracle

URL >> DECODE vs NVL Google.ru поможет
алгритм простой, если дата_выхода = NULL то подставим SYSDATE
т.е. примерно так:
Код:
SELECT ID, SUM(ROUND((NVL(DataVyxoda,SYSDATE) - DataVxoda)*1440)) DELTA_TIME  FROM MYTABLE
WHERE
TO_DATE(DataVxoda) = TO_DATE(SYSDATE)
GROUP BY ID


Oracle конечно насчет справки не так доступен как MS SQL, но всегда можно найти и функции и их описание и примеры в рунете.
Неизвестный
15.06.2009, 16:07
общий
Victor Pyrlik:
вот теперь работает, ОТЛИЧНО!
Цитата: 19206
Google.ru
это хорошо, но надо же название знать.... NVL . Спасибо! Вопрос решен.
Форма ответа