Форум: "Базы";
Текущий архив: 2005.07.18;
Скачать: [xml.tar.bz2];
ВнизПро DateTime Найти похожие ветки
← →
<Lelik> (2005-06-02 16:40) [0]Здравствуйте программеры!
Как правильно сравнить поля 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+"""");
Но эффект тот же.
Что не так, подскажите?
← →
Anatoly Podgoretsky © (2005-06-02 16:49) [1]Как определил, в Дельфи кстати предполагаемая точность 1 мс, в других серверах другая. Надо вывести в диалог для отладки значения поля и параметра как double, но и это возможно не даст точной информации.
← →
Desdechado © (2005-06-02 19:11) [2]Присвоение Value чревато ошибками, ибо это тип Variant, а к чему будет преобразовано его значение - неизвестно. Аналогично - ошибка преобразования indatetime в Value.
Т.е. фактически - двойное преобразоваие типа, причем без явного его указания. Я бы присваивал AsSQLTimeStamp или AsDateTime (зависит от сервера и компонентов доступа).
← →
Ega23 © (2005-06-02 19:22) [3]Похоже, автор имел ввиду не MySQL а MSSQL.
Так вот, есть различие в представлении типа datetime в MSSQL и в delphi. Отличие - в стартовой дате (12/30/1899 - Delphi) и (01/01/1900 для MSSQL). Так что присвоение параметра через Value - очень сомнительный способ.
← →
Anatoly Podgoretsky © (2005-06-02 19:38) [4]Ega23 © (02.06.05 19:22) [3]
Борланд это учитывает для дат
← →
Ega23 © (2005-06-02 19:45) [5]2 Anatoly Podgoretsky © (02.06.05 19:38) [4]
Борланд это учитывает для дат
А при касте через Value?
← →
Anatoly Podgoretsky © (2005-06-02 19:50) [6]Если тип TDateTime то да. Я плотно работаю с MSSQL
← →
Ega23 © (2005-06-02 19:53) [7]Если тип TDateTime то да. Я плотно работаю с MSSQL
Я где-то накололся в своё время. Поэтому и запомнил :о)
← →
Anatoly Podgoretsky © (2005-06-02 19:58) [8]Ну нельзя говорить в отрыве от кода. Я тоже нарвался, когда стал делать преобразования на сервере.
← →
sniknik © (2005-06-02 20:20) [9]> Я где-то накололся в своё время. Поэтому и запомнил :о)
я тоже помню, были споры, обсуждения, но там передача дататайма велась как числа (int и/или float). с "честной" передачей всегда все нормально.
← →
ANB © (2005-06-02 20:33) [10]Передавай строкой и не мучайся
← →
Anatoly Podgoretsky © (2005-06-02 20:44) [11]sniknik © (02.06.05 20:20) [9]
И я про тоже, если TDateTime то преобразовывается правильно.
Я очень не доволен Борландом когда он сделал подобное, при переходе с Д1 (date base 1.01.0001) на Д2 они заявили, что они сделали тип, совместимый с OLE, но как оказалось обманули.
← →
<Lelik> (2005-06-03 09:57) [12]>Ega23 © (02.06.05 19:22) [3]
>Похоже, автор имел ввиду не MySQL а MSSQL.
Да верно, MSSQL, это я промахнулся.
>ANB © (02.06.05 20:33) [10]
>Передавай строкой и не мучайся
А во втором варианте я и передаю строкой
Так все-таки как лучше, а точнее правильно?
Может кто приведет пару строк для такого запроса.
Заранее спасибо.
← →
sniknik © (2005-06-03 10:54) [13]лучше (и правильнее) параметром, именно так как в [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 11:50) [14]>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(var indatetime : TDateTime; var Mylist : TList);
А в основной программе
repeat
procedure X(var indatetime, Mylist);
if list.count > 0 then обработка листа
until
где в list я получаю рез. набор
← →
sniknik © (2005-06-03 13:31) [15]вроде об одном и томже, а как на разных языках... ;(
попробуй еще раз ответить на > [13]
> >2
это так понимаю запрос из Query Analyzer-а? и где тут параметр извне? делай также в дельфях получиш то же самое. даже если вынесеш переменную в дельфи и внесеш ее обратно параметром.
по твоей же выдержке из хелпа дельфевское время точнее, и поэтому сбиться значение от передачи через него не может.
← →
Anatoly Podgoretsky © (2005-06-03 13:51) [16]<Lelik> (03.06.05 11:50) [14]Т.е. в Delphi точность - 1мс, а в MSSQL - 3.33мс.
Может в этом моя проблема? Разгадка рядом :)
Разгадка конечно здесь, но ты не приводишь реальных данных как просили.
И по поводу в Дельфи, нет там ни каких 1 мс, есть точность в 15 знаков, первые 6 из которых день, а оставшие 9 часть этого дня, что может составлять гораздо меньшую величину.
← →
<Lelik> (2005-06-03 14:58) [17]>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 16:06) [18]Я тебя просил привести значения не как дата, а как Double?
Просил, а ты выполнил это? Нет
Так чего же ты здешь, какой ответ может быть? Никакого.
Что за странный формат, почему тут в конце месяц и секунды, какая тут тайная мысль?
← →
<Lelik> (2005-06-03 16:44) [19]>Anatoly Podgoretsky ©
>Что за странный формат, почему тут в конце месяц и секунды, >какая тут тайная мысль?
Да! Посмотрел в help, а там hh:nn:ss:zzz ! ^)
Из-за этого похоже и была проблема.
Глюки исчезли.
Потом глянул на форум, а здесь Ваша "тайная мысль" :)
А параметр я передаю строкой (как и говорил ANB ©).
datetimetostring(par, "yyyymmdd hh:nn:ss:zzz", indatetime)
Передача через параметр по-прежнему не работает
Кстати как переконвертить datetime в double?
← →
Anatoly Podgoretsky © (2005-06-03 16:59) [20]<Lelik> (03.06.05 16:44) [19]
Кстати как переконвертить datetime в double?
А не требуется, это и есть double по природеShowMessage(FloatToStr(Date))
← →
<Lelik> (2005-06-03 17:44) [21]Спасибо!
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2005.07.18;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.036 c