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

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

Про DateTime [D7, MySQL]


Страницы:   1 2

<Lelik> ©   (2005-06-02 16:40:00) 

Здравствуйте программеры!
Как правильно сравнить поля datetime.
procedure X(indatetime : TDateTime);
with ADOQuery1 do
 begin
   if Active then Close;
   SQL.Clear;
   SQL.Add('select *');
   SQL.Add('from mytable');
   SQL.Add('where field1 > :par');
   Parameters.ParamByName('par').Value := indatetime;
   Open;
где field1 - поле datetime MSSQL
В QuertAnalyzer все работает, а в Дельфях почему-то в результирующий набор включаются и строки, где field1=indatetime.
Пробовал и так
datetimetostring(str, 'yyyymmdd hh:mm:ss:mss', indatetime);
SQL.Add('where field1 >'''+str+'''');
Но эффект тот же.
Что не так, подскажите?


<Lelik>   (2005-06-03 17:44:00) [1]

Спасибо!


Anatoly Podgoretsky   (2005-06-03 16:59:00) [2]

<Lelik>   (03.06.05 16:44) [19]
Кстати как переконвертить datetime в double?

А не требуется, это и есть double по природе

ShowMessage(FloatToStr(Date))


&lt;Lelik&gt;   (2005-06-03 16:44:00) [3]

>Anatoly Podgoretsky ©
>Что за странный формат, почему тут в конце месяц и секунды, >какая тут тайная мысль?

Да! Посмотрел в help, а там hh:nn:ss:zzz! ^)
Из-за этого похоже и была проблема.
Глюки исчезли.
Потом глянул на форум, а здесь Ваша "тайная мысль" :)
А параметр я передаю строкой (как и говорил ANB ©).
datetimetostring(par, 'yyyymmdd hh:nn:ss:zzz', indatetime)
Передача через параметр по-прежнему не работает

Кстати как переконвертить datetime в double?


Anatoly Podgoretsky   (2005-06-03 16:06:00) [4]

Я тебя просил привести значения не как дата, а как Double?
Просил, а ты выполнил это? Нет
Так чего же ты здешь, какой ответ может быть? Никакого.
Что за странный формат, почему тут в конце месяц и секунды, какая тут тайная мысль?


&lt;Lelik&gt;   (2005-06-03 14:58:00) [5]

>Anatoly Podgoretsky ©
>Разгадка конечно здесь, но ты не приводишь реальных данных как >просили
после Query1.open имеем:
datetimetostring(str, 'yyyymmdd hh:mm:ss:mss', indatetime);
str = '20050603 11:39:17:614'

datetimetostring(fstr, 'yyyymmdd hh:mm:ss:mss', field1.asDateTime);
fstr = '20050603 11:39:17:614'

>И по поводу в Дельфи, нет там ни каких 1 мс, есть точность в >15 знаков, первые 6 из которых день, а оставшие 9 часть этого >дня, что может составлять гораздо меньшую величину.
>>Anatoly Podgoretsky ©   (02.06.05 16:49) [1]
>>Как определил, в Дельфи кстати предполагаемая точность 1 мс, >>в других серверах другая
т.е. в дельфях точность больше 1мс - 24*60*60*1000/1000000000 = 0,0864 мс. Я прав?

А вот запрос я делаю правильно:
SQL.Clear;
SQL.Add('select change_time [ct]');
SQL.Add('from gpv_changes');
SQL.ADD('where change_time > :lastread');
Parameters.ParamByName('lasttime').DataType := ftDateTime;
Parameters.ParamByName('lasttime').Value := indatetime;

chnge_time - поле типа datetime
indatetime параметр Delphi типа datetime
Потом проверка с помощью строк:
datetimetostring(str, 'yyyymmdd hh:mm:ss:mss', indatetime);
datetimetostring(fstr, 'yyyymmdd hh:mm:ss:mss', fieldbyname('ct').AsDateTime);


Anatoly Podgoretsky   (2005-06-03 13:51:00) [6]

<Lelik>   (03.06.05 11:50) [14]Т.е. в Delphi точность - 1мс, а в MSSQL - 3.33мс.
Может в этом моя проблема? Разгадка рядом :)
Разгадка конечно здесь, но ты не приводишь реальных данных как просили.
И по поводу в Дельфи, нет там ни каких 1 мс, есть точность в 15 знаков, первые 6 из которых день, а оставшие 9 часть этого дня, что может составлять гораздо меньшую величину.


sniknik   (2005-06-03 13:31:00) [7]

вроде об одном и томже, а как на разных языках... ;(

попробуй еще раз ответить на > [13]

> >2
это так понимаю запрос из Query Analyzer-а? и где тут параметр извне? делай также в дельфях получиш то же самое. даже если вынесеш переменную в дельфи и внесеш ее обратно параметром.
по твоей же выдержке из хелпа дельфевское время точнее, и поэтому сбиться значение от передачи через него не может.


&lt;Lelik&gt;   (2005-06-03 11:50:00) [8]

>sniknik ©
>1
Вот иногда запрос правильно, а иногда неправильно отрабатывается. Криваято включается в набор, то нет.
Это как в режиме отладки, так и в runtime.
Вот тут в Books Online еще раз глянул - ОБА-НА:
Date and time data from January 1, 1753 through December 31, 9999, to an accuracy of one three-hundredth of a second (equivalent to 3.33 milliseconds or 0.00333 seconds). Values are rounded to increments of .000, .003, or .007 seconds, as shown in the table.
Т.е. в Delphi точность - 1мс, а в MSSQL - 3.33мс.
Может в этом моя проблема? Разгадка рядом :)

>2

declare @dt datetime
select change_time
from gpv_changes
where record_id=136
select @dt = change_time
from gpv_changes
where record_id=136
select change_time
from gpv_changes
where change_time > @dt

(change_time - тип datetime)

>3
Вообще таблица, с кот. работаю (gpv_changes) - таблица изменений базы. В нее триггерами записывается таблицы, в кот. произошло изменение, тип изменения (insert/update), ID вставленной/измененной записи и время внесения изменения (default = GETDATE()).
Затем с периодом неск. секунд происходит опрос таблицы изменений. Причем выбираются только те записи, для кот. время изменения > времени изменения последней считанной строки предыдущих опросов.
Так вот как я и говорил в набор включается лишняя строка, где время = времени последней считанной строки. А этого мне не надо :)
И еще procedure X( varindatetime : TDateTime; var Mylist : TList);
А в основной программе

repeat
procedure X(var indatetime, Mylist);
if list.count > 0 then обработка листа
until

где в list я получаю рез. набор


sniknik   (2005-06-03 10:54:00) [9]

лучше (и правильнее) параметром, именно так как в [0], и дело не в том что это работает неправильно, а в том как ты воспринимаеш (ожидаеш не того, и не равные условия сравниваеш) если бы попытался ответить на [1] (в частности "как определил?") давно бы во всем разобрался...

ладно, еше парочку "самонаводящихся" вопросов спрошу ;о)
1 чему равны str после datetimetostring(str, 'yyyymmdd hh:mm:ss:mss', indatetime); в приведенном запросе, и тут же чему равно значение fstr datetimetostring(fstr, 'yyyymmdd hh:mm:ss:mss', field1.asDateTime); после запроса, где как говориш неправильно и field1=indatetime. (???)

2 как задаеш аналогичный запрос с параметром в Quert Analyzer? интересует значение параметра.

3 ну и откуда береш значение indatetime в дельфи?

p.s. ну и чисто по догадкам, не имея точных данных, "синхронизировать" результат запроса в дельфи с результатом в Quert Analyzer можно просто вызвая процедуру ([0]) так X(Trunc(indatetime)); (возможно потребуется приведение типа) а не так как у тебя сейчас.


&lt;Lelik&gt;   (2005-06-03 09:57:00) [10]

>Ega23 ©   (02.06.05 19:22) [3]
>Похоже, автор имел ввиду не MySQL а MSSQL.
Да верно, MSSQL, это я промахнулся.

>ANB ©   (02.06.05 20:33) [10]
>Передавай строкой и не мучайся
А во втором варианте я и передаю строкой

Так все-таки как лучше, а точнее правильно?
Может кто приведет пару строк для такого запроса.
Заранее спасибо.


Anatoly Podgoretsky   (2005-06-02 20:44:00) [11]

sniknik ©   (02.06.05 20:20) [9]
И я про тоже, если TDateTime то преобразовывается правильно.
Я очень не доволен Борландом когда он сделал подобное, при переходе с Д1 (date base 1.01.0001) на Д2 они заявили, что они сделали тип, совместимый с OLE, но как оказалось обманули.


ANB   (2005-06-02 20:33:00) [12]

Передавай строкой и не мучайся


sniknik   (2005-06-02 20:20:00) [13]

> Я где-то накололся в своё время. Поэтому и запомнил   :о)
я тоже помню, были споры, обсуждения, но там передача дататайма велась как числа (int и/или float). с "честной" передачей всегда все нормально.


Anatoly Podgoretsky   (2005-06-02 19:58:00) [14]

Ну нельзя говорить в отрыве от кода. Я тоже нарвался, когда стал делать преобразования на сервере.


Ega23   (2005-06-02 19:53:00) [15]

Если тип TDateTime то да. Я плотно работаю с MSSQL

Я где-то накололся в своё время. Поэтому и запомнил   :о)


Anatoly Podgoretsky   (2005-06-02 19:50:00) [16]

Если тип TDateTime то да. Я плотно работаю с MSSQL


Ega23   (2005-06-02 19:45:00) [17]

2 Anatoly Podgoretsky ©   (02.06.05 19:38) [4]
Борланд это учитывает для дат

А при касте через Value?


Anatoly Podgoretsky   (2005-06-02 19:38:00) [18]

Ega23 ©   (02.06.05 19:22) [3]
Борланд это учитывает для дат


Ega23   (2005-06-02 19:22:00) [19]

Похоже, автор имел ввиду не MySQL а MSSQL.
Так вот, есть различие в представлении типа datetime в MSSQL и в delphi. Отличие - в стартовой дате (12/30/1899 - Delphi) и (01/01/1900 для MSSQL). Так что присвоение параметра через Value - очень сомнительный способ.


Desdechado   (2005-06-02 19:11:00) [20]

Присвоение Value чревато ошибками, ибо это тип Variant, а к чему будет преобразовано его значение - неизвестно. Аналогично - ошибка преобразования indatetime в Value.
Т.е. фактически - двойное преобразоваие типа, причем без явного его указания. Я бы присваивал AsSQLTimeStamp или AsDateTime (зависит от сервера и компонентов доступа).


Страницы:   1 2

Наверх

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