Форум: "Базы";
Текущий архив: 2005.03.20;
Скачать: [xml.tar.bz2];
ВнизДата в IB Найти похожие ветки
← →
msguns © (2005-02-18 11:43) [0]Вот такая проблема: в IB (1) есть формат данных Data, где хранится не только число (дд.мм.гггг), но и время (чч.мм.сс)
Выборки по датам решаются простым диапазоном типа
1.01.2005 00:00:00 - 31.03.2005 23:59:59
Но !!! Есть задачки, где надо выбирать по дням. Например, при сводке статистики прокси надо получить сводные данные о том, сколько каждый клиент юзал инет в днях.
Напрямую запросом вытащить эту инфу из конвертенного сквид-лога нельзя (по крайней мере у меня это не вышло). В рез-те написать ХП, которая выбирает из лога записи за период, прикручивая к вых.НД YEAR, MONTH и DAY, а потом уж со всей этой фигней идут подсчеты. Однако все считается так долго, что нету никакой мочи терпеть (записей в конвертенном логе сотни тысяч).
В результате не придумал ничего лучше, как прикрутить к ибэшной таблице лога доп. чар-поле, куда при конверте вкачиваю дату по шаблону DDMMYYYY. После этого все должно бегать быстрее.
А как использовать дату в натуральном виде ?
← →
Johnmen © (2005-02-18 11:51) [1]Серёга,
CAST(D2-D1-0.5 AS INT)
, количество полных дней между...
← →
msguns © (2005-02-18 12:06) [2]>Johnmen © (18.02.05 11:51) [1]
Не понял я, Жень ;(
пример?:
192.168.42.1 12.01.2005 08:20:35
192.168.42.1 12.01.2005 08:20:38
192.168.42.1 12.01.2005 08:24:29
192.168.42.1 12.01.2005 08:28:51
...
192.168.42.1 13.01.2005 08:20:35
192.168.42.1 13.01.2005 08:20:38
192.168.42.1 13.01.2005 08:24:29
192.168.42.1 13.01.2005 08:28:51
Надо получить:
192.168.42.1 2
← →
ЮЮ © (2005-02-18 12:12) [3]SELECT
IpAddress, COUNT (DISTINCT CAST(ConnectionTime AS int))
GROUP BY
IpAddress
← →
Domkrat © (2005-02-18 12:21) [4]as Date
← →
Johnmen © (2005-02-18 12:23) [5]>ЮЮ © (18.02.05 12:12) [3]
Дата не кастуется к численным типам !!!
>msguns © (18.02.05 12:06) [2]SELECT
IpAddress, COUNT (DISTINCT CAST(ConnectionTime-(CAST("01.01.1900" AS DATE)) AS int))
GROUP BY
IpAddress
← →
Johnmen © (2005-02-18 12:24) [6]>Domkrat © (18.02.05 12:21) [4]
См. вопрос - 1 диалект !!!
← →
msguns © (2005-02-18 12:26) [7]>ЮЮ © (18.02.05 12:12) [3]
Overflow occured during data type convertion.
conversion error from string "21-JAN-2005 11:46:04.0000".
Даты, ессно, корректны
← →
P.N.P. © (2005-02-18 12:39) [8]SELECT
IpAddress,cast(max(ConnectionTime)-min(ConnectionTime)+0.5 as integer)
GROUP BY
IpAddress
← →
Johnmen © (2005-02-18 12:47) [9]>P.N.P. © (18.02.05 12:39) [8]
Ню-ню, как говорят некоторые...:)
← →
P.N.P. © (2005-02-18 12:53) [10]>Johnmen © (18.02.05 12:47) [9]
>Ню-ню,
что ню? Я где-то неправ?
← →
msguns © (2005-02-18 12:54) [11]Жень, а как вывести просто дату ?
← →
ЮЮ © (2005-02-18 12:55) [12]>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
← →
Johnmen © (2005-02-18 12:58) [13]>ЮЮ © (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 13:11) [14]>Дата не кастуется к численным типам !!!
а (дата - дата) уже кастуется [5]???
Странный всё-таки этот ваш IB :)
← →
Danilka © (2005-02-18 13:18) [15][14] ЮЮ © (18.02.05 13:11)
дата минус дата будет число, где целая часть - дни, дробная - разница во времени.
И не только в ИБ, но и в МССкуле и в Орокле
← →
Johnmen © (2005-02-18 13:21) [16]>ЮЮ © (18.02.05 13:11) [14]
Ничего странного, а всё ОЧЕНЬ логично и осознаваемо.
Есть даты а есть временные интервалы. Это СОВЕРШЕННО разные "субстанции".
← →
ЮЮ © (2005-02-18 13:24) [17]А просто дата - это не число, где целая часть - дни, дробная - времени оттситываемое от некоторой "начальной даты"?
В МS SQL можно от даты и число отнимать, не только дату
← →
ЮЮ © (2005-02-18 13:27) [18]>Есть даты а есть временные интервалы
Дата, между прочим, есть временной интервал от дня, от которого ведется летоисчисление.
← →
Johnmen © (2005-02-18 13:30) [19]>ЮЮ ©
Что такое дата ? Это количество некоторых единиц от точки отсчета. Точка отсчета м.б. где угодно, и на неё в продуманных системах не закладываются.
Значит, допустимы операции вычитания дат (= интервал), сложение/вычитание из дат интервалов.
← →
Danilka © (2005-02-18 13:30) [20][17] ЮЮ © (18.02.05 13:24)
> В МS SQL можно от даты и число отнимать, не только дату
Думаецца, везде так можно, по крайней мере в Орокле точно. Там вообще, в отличие от МССкуля (здесь смайлик), для работы с датой есть удобные функции, например TRUNC для дат отсекает время, а вот-так: TRUNC(какая_то_дата, "MM") возвращает первый день месяца. :))
← →
msguns © (2005-02-18 13:36) [21]>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]
Сейчас попробую твой вариант (пришла уборщица и выгоняет - пойду подышу в "палочку здоровья") ;)
← →
msguns © (2005-02-18 13:42) [22]>P.N.P. © (18.02.05 12:53) [10]
>что ню? Я где-то неправ?
Неправ. Не прочитал или недопонял условие. См.[21]
← →
ЮЮ © (2005-02-18 13:45) [23]>Т.е. на проверенных мною 12 ключах
Плох проверял. Напиши
SELECT DISTINCT <проходящий вариант преобразования даты в целое>
FROM table
WWHRE ip = <Ip вызывающий сомнение>
и подсчитай
← →
Johnmen © (2005-02-18 13:48) [24]>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
← →
msguns © (2005-02-18 13:53) [25]Вот это прокатило на уря:
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
← →
msguns © (2005-02-18 13:55) [26]>Johnmen © (18.02.05 13:48) [24]
Запостился, потом увидел твой ;))
← →
msguns © (2005-02-18 17:04) [27]Большое спасибо всем.
Особенно Johnmen © :)
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2005.03.20;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.037 c