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

Вниз

Отбор по дате   Найти похожие ветки 

 
Link   (2002-08-23 14:03) [0]

Уважаемые мастера! Только щас дошло, что следующий запрос отбирает не записи, созданные до определённой даты, а записи, существующие в промежутке между указанными днями каждого месяца. (Если я не прав, скажите мне) То есть некоторые записи выпускаются.

Help!!!!
Совершенно не представляю как сделать , чтобы отбирались записи, созданные до указанной даты. Подскажите, пожалуйста.

Запрос:

select timestamp,src_IP,dst_IP,sent,recv from traffic_USER
WHERE (DATEPART(dd, CAST(timestamp AS datetime))between :ddStart and :ddEnd)
and (DATEPART(mm, CAST(timestamp AS datetime))between :mmStart and :mmEnd )
and recv>0;
--and sent > 0


 
Reindeer Moss Eater   (2002-08-23 14:15) [1]

Where Поле_Даты < Заданной_Даты


 
MOA   (2002-08-23 14:18) [2]

Если у Вас срабатывает
DATEPART(dd, CAST(timestamp AS datetime))
то вот так

select timestamp,src_IP,dst_IP,sent,recv from traffic_USER
WHERE (CAST(timestamp AS datetime) between :ddStart and :ddEnd)
and (recv>0)

Удачи!


 
Link   (2002-08-23 14:26) [3]

Нет, всё равно, что-то не то..


 
3JIA9I CyKA ©   (2002-08-23 14:29) [4]

А какого типа timestamp?


 
Link   (2002-08-23 14:32) [5]


> 3JIA9I CyKA

datetime


 
SergSuper   (2002-08-23 14:37) [6]

дык проще надо, это же очевидно

select timestamp,src_IP,dst_IP,sent,recv from traffic_USER
WHERE DATEPART(dd, CAST(timestamp AS datetime))+DATEPART(mm, CAST(timestamp AS datetime))*31
between :ddStart + :mmStart*31 and :ddEnd + :mmEnd *31
and recv>0;
--and sent > 0

по хорошему еще бы и год надо учесть

Кстати мне не нравится конструкция CAST(timestamp AS datetime). Вы осознанно её используете?


 
SergSuper   (2002-08-23 14:44) [7]

а можно и короче

select timestamp,src_IP,dst_IP,sent,recv from traffic_USER
WHERE DAY(timestamp)+MONTH(timestamp)*31
between :ddStart + :mmStart*31 and :ddEnd + :mmEnd *31
and recv>0;
--and sent > 0

ну в принципе и еще есть варианты


 
MOA   (2002-08-23 14:51) [8]

Никак не могу сообразить, а почему же просто
(CAST(timestamp AS datetime) between :ddStart and :ddEnd)
не работает? И опять же, если timestamp имеет тип datetime, лучше его переименовать, если есть такая возможность.


 
Link   (2002-08-23 14:56) [9]


> SergSuper

Всё получилось, огромное тебе спасибо!

Но я с базами данных работаю недавно, тем более с запросами. Если тебе не сложно, объясни откуда взялась 31 и почему ты это всё складываешь...
Может тебе это и очевидно, тоды я бы хотел, чтобы и мне...
В любом случае спасибо!


 
MOA   (2002-08-23 14:56) [10]

Забыл. Если (Link (23.08.02 14:32) timestamp типа datetime, то CAST зачем? Просто
[timestamp] between :ddStart and :ddEnd
И опять же поле timestamp не типа timestamp - это все-же приключения.
Удачи!


 
Link   (2002-08-23 14:58) [11]


> MOA

Извини не знаю, но, к сожалению переименовывать уже поздно, придётся много чего другого переписывать...


 
DmitryK ©   (2002-08-23 15:07) [12]

2Link

все именно так, как ты говоришь, твой запрос выбирает все записи между указанными номерами дней, во всех месяцах между указанными номерами месяцев.

в исходной форме ты бы должен был построить ограничение следующим образом

((месяц>=mmStart AND день>=ddStart) OR (месяц>mmStart)) AND
((месяц<=mmEND AND день<=ddEnd) OR (месяц<mmEnd))


(кажется так, но на всякий случай перепроверь - построй таблицу истинности)


 
DmitryK ©   (2002-08-23 15:12) [13]

но я думаю лучше не мудохаться с переходами от даты к числу и потом обратно, лучше искать непосредственно от указанной даты - до указанной даты

объясни, почему ты не хочешь(не можешь) воспользоваться столь удобным способом ограничить выборку????????


 
Link   (2002-08-23 15:33) [14]

Мне нужно ещё ограничивать по минутам и секундам.

> SergSuper

К стати, как это получится

select timestamp,src_IP,dst_IP,sent,recv from traffic_USER
WHERE DAY(timestamp)+MONTH(timestamp)+MINUTE(timestamp)+SECOND(timestamp)*31
between :ddStart + :mmStart+:hhStart+:miStart*31 and :ddEnd + :mmEnd +:hhEnd+:miEnd*31
and recv>0;
--and sent > 0 ????

Всё таки не доходит, 31 - это что? дни?


 
Link   (2002-08-23 15:39) [15]

А вообще можно так писать MINUTE(timestamp)+SECOND(timestamp) ?


 
Link   (2002-08-23 15:55) [16]

Всё-таки, здесь

select timestamp,src_IP,dst_IP,sent,recv from traffic_USER
WHERE DAY(timestamp)+MONTH(timestamp)*31
between :ddStart + :mmStart*31 and :ddEnd + :mmEnd *31
and recv>0;
--and sent > 0

что значит 31? И как быть с минутами и секундами?


 
MOA   (2002-08-23 16:03) [17]

Только сейчас понял, что под ddStart и ddEnd Link имел в виду именно день. Прошу прощения - не понял вопрос. Я имел в виду , что ddEnd и ddStart - это даты (типа datetime). Тогда можно примерно вот так

[timestamp]
BETWEEN CAST(CAST(yyStart AS NCHAR(4))+"-"+CAST(mmStart AS NCHAR(2))+"-"+CAST(ddStart AS NCHAR(2))+" "+CAST(minStart AS NCHAR(2))+":"+CAST(secStart AS NCHAR(2)) AS datetime)
AND
CAST(CAST(yyEnd AS NCHAR(4))+"-"+CAST(mmEnd AS NCHAR(2))+"-"+CAST(ddEnd AS NCHAR(2))+" "+CAST(minEnd AS NCHAR(2))+":"+CAST(secEnd AS NCHAR(2)) AS Datetime)

но лучше, конечно, на клиенте сформировать готовые параметры типа datetime и передавать уже их, как справедливо указал DmitryK.


 
DmitryK ©   (2002-08-23 16:03) [18]

2Link
> что значит 31?


неужели так и не догодался?

31 - это количество дней в месяце. :)


 
Link   (2002-08-23 16:07) [19]


> DmitryK

Дошло! ..Бывают в жизни неудачи :))
> MOA

Щас попробую..


 
SergSuper   (2002-08-23 16:56) [20]

DmitryK, интересно а если бы я на 100 умножал как бы Вы объяснили?
Дело в следующем.
Если у нас только даты - то всё понятно. Но если есть месяц, то получается что мы в первую очередь должны учесть его. Мы должны придать месяцу какой-то вес, причем в любом случае он должен быть больше чем любой день. Для этого и умножаем на 31. На самом деле можно не на 31, а на любое число, большее чем количество дней в месяце.
Если не понятно то можно воспользоваться аналогией с десятичными числами: число 45 можно представить ведь как 4*10+5. И сравнивать с числом 64, представленном в виде 6*10+4. Но сравнение будет корректно если мы будет умножать не на 10, а на любое другое большее число: 4*100+5 < 6*100+4.
Если мы рассматривает 5-е апреля(05/04), то мы его можем представать как 4*31+5. Можно еще учитывать год - но это я оставляю как домашнее заданее :)


 
Link   (2002-08-23 17:16) [21]


> SergSuper

Боюсь ты опоздал :) это-то до меня уже дошло, но как же быть с секундами и минутами!!
> MOA

Я чуть-чуть переделал твой код

select timestamp,src_IP,dst_IP,sent,recv from traffic_USER
WHERE timestamp
BETWEEN CAST(CAST(:ddStart AS NCHAR(2))+"."+CAST(:mmStart AS NCHAR(2))+"."+CAST(:yyStart AS NCHAR(4))+" "+CAST(:miStart AS NCHAR(2))+":"+CAST(:hhStart AS NCHAR(2)) AS datetime)
AND
CAST(CAST(:ddEnd AS NCHAR(2))+"."+CAST(:mmEnd AS NCHAR(2))+"."+CAST(:yyStart AS NCHAR(4))+" "+CAST(:miEnd AS NCHAR(2))+":"+CAST(:hhEnd AS NCHAR(2)) AS Datetime)

Так выдаёт меньше ошибок :) но всё равно говорит, что "Приложение использует для текущей операции значение не верного типа" может ты знаешь в чём дело?



 
SergSuper   (2002-08-23 17:32) [22]

2 Link
Если не знаешь как быть с минутами и секундами - значит не дошло :)

Можно еще переделать метод MOA

select timestamp,src_IP,dst_IP,sent,recv from traffic_USER
WHERE timestamp
BETWEEN dateadd(yy, :yyStart-2000, dateadd(mm,dateadd(mm, :mmStart-1,dateadd(dd, :ddStart-1,dateadd(mi, :miStart, dateadd(hh, :hhStart,"20000101")))))
and dateadd(yy, :yyEnd-2000, dateadd(mm,dateadd(mm, :mmEnd-1,dateadd(dd, :ddEnd-1,dateadd(mi, :miEnd, dateadd(hh, :hhEnd,"20000101")))))


Но всё это тупиковый путь, извращения даже (в том числе и что я предложил) - лучше передавать не кучу параметров(год, месяц, день, час), а одну дату, для этого и существует соответствующий тип.


 
Link   (2002-08-23 17:40) [23]


> SergSuper

Просто в твой первый код нельзя добавить MINUTE и SECOND, пишет, что такого не бывает.


> лучше передавать не кучу параметров(год, месяц, день, час),
> а одну дату, для этого и существует соответствующий тип.

Тогда, будь другом, скажи, как это написать, если только одна переменная, где одна дата, содержащая год, месяц, день, час.
А то я уже запарился... :


 
MOA   (2002-08-23 17:58) [24]

>выдаёт меньше ошибок
Странно ;), у меня запрос работает без ошибок (копировал прямо из аналайзера). А текст ошибки - по русски?
> как это написать, если только одна переменная, где одна дата, содержащая год, месяц, день, час
Пишем в TQuery (или TADOQuery):
select timestamp,src_IP,dst_IP,sent,recv from traffic_USER
WHERE ([timestamp] between :StartDate and :EndDate)
and (recv>0)
В параметрах появятся параметры StartDate и EndDate с типом ftDateTime. Присваиваем нужные значение и все. Вот пока писал, сделал у себя -все работает.
Удачи!


 
Link   (2002-08-24 09:31) [25]


> MOA

Спасибо за помощь!

Оказалось, что я не правильно записываю значение даты, а нужно так 02/31/12 23:12:21 и ещё в другом запросе не было скобок. И из-за этого не получалось!!!! Бывает же так, а сколько нервов...

Ну теперь-то всё работает :)

Спасибо всем за советы и поддержку! :)




Страницы: 1 вся ветка

Текущий архив: 2002.09.16;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.012 c
1-50854
Vint44
2002-09-04 12:23
2002.09.16
Добавление компонента в run-time


1-50698
Micah'GF
2002-09-04 21:06
2002.09.16
Нужно держать 2 копии программы.


3-50594
Ulyanov
2002-08-25 15:34
2002.09.16
Install Shield не создаёт alias


14-50949
Oleg_Gashev
2002-08-21 19:38
2002.09.16
Что-то в магазине не видел. А сколько стоит?


8-50878
Sopromat
2002-05-11 00:43
2002.09.16
Помогите!!! Нужно построить график функции вида: X1^2+X2^2......