Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Дата в IB [IB6.x]


Страницы:   1 2

msguns ©   (2005-02-18 11:43:00) 

Вот такая проблема: в IB (1) есть формат данных Data, где хранится не только число (дд.мм.гггг), но и время (чч.мм.сс)
Выборки по датам решаются простым диапазоном типа
1.01.2005 00:00:00 - 31.03.2005 23:59:59

Но !!! Есть задачки, где надо выбирать по дням. Например, при сводке статистики прокси надо получить сводные данные о том, сколько каждый клиент юзал инет в днях.
Напрямую запросом вытащить эту инфу из конвертенного сквид-лога нельзя (по крайней мере у меня это не вышло). В рез-те написать ХП, которая выбирает из лога записи за период, прикручивая к вых.НД YEAR, MONTH и DAY, а потом уж со всей этой фигней идут подсчеты. Однако все считается так долго, что нету никакой мочи терпеть (записей в конвертенном логе сотни тысяч).
В результате не придумал ничего лучше, как прикрутить к ибэшной таблице лога доп. чар-поле, куда при конверте вкачиваю дату по шаблону DDMMYYYY. После этого все должно бегать быстрее.
А как использовать дату в натуральном виде ?


msguns   (2005-02-18 17:04:00) [1]

Большое спасибо всем.
Особенно Johnmen © :)


msguns   (2005-02-18 13:55:00) [2]

>Johnmen ©   (18.02.05 13:48) [24]

Запостился, потом увидел твой ;))


msguns   (2005-02-18 13:53:00) [3]

Вот это прокатило на уря:

SELECT L.sqip, L.sqnodurl,
 COUNT (DISTINCT CAST(EXTRACT(YEAR FROM L.sqtime)*10000+
        EXTRACT(MONTH FROM L.sqtime)*100+
        EXTRACT(DAY FROM L.sqtime) as INT)),
 COUNT (DISTINCT L.squrl), COUNT(L.sqtime), SUM(L.sqpsize)
 FROM sqlog L
 GROUP BY L.sqip, L.sqnodurl
 ORDER BY L.sqip, L.sqnodurl


Johnmen   (2005-02-18 13:48:00) [4]

>msguns ©   (18.02.05 13:36) [21]

SELECT UserField,
 COUNT(DISTINCT EXTRACT(MONTH FROM DateField)+
                EXTRACT(YEAR FROM DateField)*100)
FROM Table
WHERE ...
GROUP BY UserField


ЮЮ   (2005-02-18 13:45:00) [5]

>Т.е. на проверенных мною 12 ключах

Плох проверял. Напиши
SELECT DISTINCT <проходящий вариант преобразования даты в целое>
FROM table
WWHRE ip = <Ip вызывающий сомнение>

и подсчитай


msguns   (2005-02-18 13:42:00) [6]

>P.N.P. ©   (18.02.05 12:53) [10]
>что ню? Я где-то неправ?

Неправ. Не прочитал или недопонял условие. См.[21]


msguns   (2005-02-18 13:36:00) [7]

>Johnmen ©   (18.02.05 12:23) [5]

Запрос по этой рыбе дает нерегулярную ошибку. Т.е. на проверенных мною 12 ключах (значения заголовков, в моем случае это пара IP + NODEURL) правильно досчитано кол-во дней у 11, а у одного вместо 20 реальных выдало 17 ;(

Еще раз уточню: мне не надо количество дней в интервале времени как период в днях ! Мне надо просто сколько дней (дат) данный узер (IP) шарился по данному домену (NODEURL). В смысле если в месяце всего 22 дня (рабочих), а узер лазил туда 3, 6 и 10 (по барабану сколько раз и в какое время), чтоб запрос мне выдал 3

>P.N.P. ©   (18.02.05 12:39) [8]

Сейчас попробую твой вариант (пришла уборщица и выгоняет - пойду подышу в "палочку здоровья") ;)


Danilka   (2005-02-18 13:30:00) [8]

[17] ЮЮ ©   (18.02.05 13:24)
> В МS SQL можно от даты и число отнимать, не только дату

Думаецца, везде так можно, по крайней мере в Орокле точно. Там вообще, в отличие от МССкуля (здесь смайлик), для работы с датой есть удобные функции, например TRUNC для дат отсекает время, а вот-так: TRUNC(какая_то_дата, 'MM') возвращает первый день месяца. :))


Johnmen   (2005-02-18 13:30:00) [9]

>ЮЮ ©  

Что такое дата ? Это количество некоторых единиц от точки отсчета. Точка отсчета м.б. где угодно, и на неё в продуманных системах не закладываются.
Значит, допустимы операции вычитания дат (= интервал), сложение/вычитание из дат интервалов.


ЮЮ   (2005-02-18 13:27:00) [10]

>Есть даты а есть временные интервалы

Дата, между прочим, есть временной интервал от дня, от которого ведется летоисчисление.


ЮЮ   (2005-02-18 13:24:00) [11]

А просто дата - это не число, где целая часть - дни, дробная - времени оттситываемое от некоторой "начальной даты"?

В МS SQL можно от даты и число отнимать, не только дату


Johnmen   (2005-02-18 13:21:00) [12]

>ЮЮ ©   (18.02.05 13:11) [14]

Ничего странного, а всё ОЧЕНЬ логично и осознаваемо.
Есть даты а есть временные интервалы. Это СОВЕРШЕННО разные "субстанции".


Danilka   (2005-02-18 13:18:00) [13]

[14] ЮЮ ©   (18.02.05 13:11)
дата минус дата будет число, где целая часть - дни, дробная - разница во времени.
И не только в ИБ, но и в МССкуле и в Орокле


ЮЮ   (2005-02-18 13:11:00) [14]

>Дата не кастуется к численным типам !!!
а (дата - дата) уже кастуется [5]???
Странный всё-таки этот ваш IB :)


Johnmen   (2005-02-18 12:58:00) [15]

>ЮЮ ©   (18.02.05 12:55) [12]

Да не хранит он дату в символьном виде !!!
Ещё раз [5]

>P.N.P. ©   (18.02.05 12:53) [10]

Конечно. В том, что привёл...

>msguns ©   (18.02.05 12:54) [11]

Куда вывести, Серёга ?


ЮЮ   (2005-02-18 12:55:00) [16]

>conversion error from string "21-JAN-2005 11:46:04.0000".

Ну так, блин, кто думал, что и ты дату в символьном виде хранить будешь :)
Тогда

SELECT
IpAddress, COUNT (DISTINCT CAST(CAST(ConnectionTime AS dattime) as int)
GROUP BY
IpAddress


msguns   (2005-02-18 12:54:00) [17]

Жень, а как вывести просто дату ?


P.N.P.   (2005-02-18 12:53:00) [18]

>Johnmen ©   (18.02.05 12:47) [9]
>Ню-ню,
что ню? Я где-то неправ?


Johnmen   (2005-02-18 12:47:00) [19]

>P.N.P. ©   (18.02.05 12:39) [8]

Ню-ню, как говорят некоторые...:)


P.N.P.   (2005-02-18 12:39:00) [20]

SELECT
IpAddress,cast(max(ConnectionTime)-min(ConnectionTime) +0.5as integer)
GROUP BY
IpAddress


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо