![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Про DateTime [D7, MySQL]
<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))
<Lelik> (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?
Просил, а ты выполнил это? Нет
Так чего же ты здешь, какой ответ может быть? Никакого.
Что за странный формат, почему тут в конце месяц и секунды, какая тут тайная мысль?
<Lelik> (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-а? и где тут параметр извне? делай также в дельфях получиш то же самое. даже если вынесеш переменную в дельфи и внесеш ее обратно параметром.
по твоей же выдержке из хелпа дельфевское время точнее, и поэтому сбиться значение от передачи через него не может.
<Lelik> (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)); (возможно потребуется приведение типа) а не так как у тебя сейчас.
<Lelik> (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 (зависит от сервера и компонентов доступа).