PDA

View Full Version : عدم هم خوانی نوع dateTimeبین access , delphi



ES.MERAT
سه شنبه 29 آبان 1386, 17:44 عصر
سلام دوستان
من با access یایگاه داده ای ایجاد کردم و qry که در محیط access می نویسم اجرا می شود .

Select TOP 1 ID
From TaskReport
Where (( StartDate <= :PrmStartDate ) AND ( :PrmStartDate <= FinishDate))
OR
(( StartDate <= :PrmFinishDate )AND ( :PrmFinishDate <= FinishDate))
OR
((:PrmStartDate <= StartDate ) AND ( StartDate <= :PrmFinishDate))
OR ((:PrmStartDate <= FinishDate ) AND ( FinishDate <= :PrmFinishDate))

ولی وقتی در دلفی توسط Ado همین qry را می نویسم اجرا نمی شود .


qryParallel.Parameters.ParamByName('PrmStartDate') .Value:= qryStartDate.AsDateTime; qryParallel.Parameters.ParamByName('PrmFinishDate' ).Value:= qryFinishDate.AsDateTime;
qryParallel.Open;
if not(qryParallel.IsEmpty) then
begin
msgError:= msgNotValidDate;
Result:= False;
Exit; end
فکر کنم نوع داده ای DateTime را درست نمی گیرد. هیچ خطایی نمی دهد ولی نتیجه درست را نمی آورد.
راستی چطوری می تونم Qry در حال اجرا در access مثل profiler sqlServer , ببینم .

ghabil
سه شنبه 29 آبان 1386, 22:29 عصر
Delphi تاریخ رو بر اساس روزهای گذشته از 1/1/1800 جساتب میکنه در حالیکه SQLServer و Access بر اساس روزهای گذشته از 30/12/1799 ، در نتیجه کوئری رو AsDateTime ست کردن یک مقداری دردسرساز میشه راه بهتر اینه که تاریخ رو بصورت String بفرستی. یعنی از توی دلفی DateToStr کنی و بعد بزنی توی کوئریت، ضمنا تا جایی که من میدونم اکسس چیزی مثل پروفایلر نداره.

dkhatibi
چهارشنبه 30 آبان 1386, 07:09 صبح
من دیشب امتحان کردم شما می تونید فیلدتون را string تعریف کنید و حتا Datetimetostr(Now) را هم به کار برید. در این صورت موقع خواندن هم از دلفی مشکلی ندارید و به راحتی می تونید با تابع TimeToStr و DateToStr مقادیر تاریخ و ساعت را از فیلد ذخیره شده بیرون بکشید.

Mohammad_Mnt
سه شنبه 13 آذر 1386, 19:36 عصر
من دقیقاً همون تاریخی را توی MS-SQL می‌بینم که از داخل دلفی با متد AsDateTime فرستادم!!

ghabil
چهارشنبه 14 آذر 1386, 00:40 صبح
یک تست ساده :



Select Cast(GetDate as int)

نتیجه واسه امروز میشه :39419



ShowMessage(FloatToStr(Real(Date)));

نتیجه واسه همین امروز میشه 39421

اعداد رو هم تصحیح میکنم دلفی از تاریخ 12/30/1899 محاسبه میکنه در حالیکه SQL Server از تاریخ 01/01/1900 (100 سال جابجا گفته بودم که دیگه قابل این حرفا رو نداره که)

اینم توضیح بیشتر (http://www.delphipages.com/threads/thread.cfm?ID=131777&G=131772&SAR=TRUE)

Mohammad_Mnt
چهارشنبه 14 آذر 1386, 02:41 صبح
ولی فکر کنم خود کامپوننت‌های ADO توی دلفی این را اصلاح می کنه. تست کن ببین تاریخی که از داخل دلفی توی یه رکورد از جدول MSSQL قرار می‌دی دقیقاً یکیه

ghabil
چهارشنبه 14 آذر 1386, 12:11 عصر
توی لینک توضیحات نوشته بود اگه میخوندی، درایورها اکثرا این مشکل رو حل میکنند ، ولی مثلا توی پارامترهایی که ساخته میشند بعضا نمیتونند این مشکل رو حل کنند... به هر حال راهی که آدم همیشه خیالش راحت باشه همونه که توی پارامترها و کوئری ها از شکل استرینگی تاریخ استفاده کنه

m101_30
سه شنبه 20 آذر 1386, 12:54 عصر
شما در جستجو زمانی که از نوع datetime استفاده می کنید زمان هم محاسبه می‌شود مثلا "5:12:10 15/11/2007" بنابراین اگر ساعت به اطلاعات درون بانک نخورد چیزی را برنمی گرداند. (حتی اگر 1 ثانیه تفاوت داشته باشند.)
شما برای جستجو باید تنها Date ها را مقایسه کنید و تابع dateof را برای داشتن تنها تاریخ استفاده کنید.