Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.03.20;
Скачать: CL | DM;

Вниз

Дата в 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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.068 c
1-1109932176
AngelOKES
2005-03-04 13:29
2005.03.20
Нужен алгоритм работы с огромными числами (до 200 десятичных зна)


1-1110011376
Creator___
2005-03-05 11:29
2005.03.20
Service Application в Delphi 7.0


8-1102160272
Студент_
2004-12-04 14:37
2005.03.20
Идентичное отображение на принтере


1-1109935767
Gek1
2005-03-04 14:29
2005.03.20
Реестр


3-1109040283
Киря
2005-02-22 05:44
2005.03.20
Как перегнать базу данных из PARADOX в ACCESS?