Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.51 MB
Время: 0.045 c
14-1119515894
dtl
2005-06-23 12:38
2005.07.18
3d координатная сетка,повороты,масштабирование...


14-1119918032
Desam
2005-06-28 04:20
2005.07.18
Где работать?


1-1119788329
начинающий
2005-06-26 16:18
2005.07.18
Как определить, пуста ли определенная папка?


1-1119801165
Euro
2005-06-26 19:52
2005.07.18
Modal Form


9-1111853342
parovoZZ
2005-03-26 19:09
2005.07.18
Поменять изображение на поверхности





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский