Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2002.09.16;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.01 c
1-50727
billybons
2002-09-05 15:51
2002.09.16
как запретить форме закрываться по Alt-F4 ?


6-50883
Хусга
2002-07-02 21:41
2002.09.16
Как принять сообщение посланое Winpopup`ом или net send`ом ?


1-50711
Hooch
2002-09-05 12:29
2002.09.16
ehLib


1-50665
KARNAGE
2002-09-04 18:20
2002.09.16
как из программы выделить все записи DbGrid?


3-50601
Ivanov Sergey
2002-08-22 20:31
2002.09.16
Пользователи и их права





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский