ورود

View Full Version : فیلتر بین دو ساعت



rahele_sa
شنبه 16 اردیبهشت 1385, 11:16 صبح
سلام

من تو SQL یک فیلدی دارم که زمان را درخودش نگه میداره

از نوع VarChar8 است

مقدار هایی هم که میگیره
اینجوریه

12:24:30

20:30:45

15:01:14
حالا من میخواهم تمام رکورد هایی که مقدار زمانشان بین ساعت 12:00:00 تا 14:00:00 است را فیلتر کنم

در واقع نوشتن کد SQL اش را بلد نیستم

یادتون باشه که فیلد از نوع VarChar8 است

مرسی

SH.Daneshvar
شنبه 16 اردیبهشت 1385, 12:10 عصر
خوب کارشما اشتباه هست.
بایستی فیلد ها رو از نوع عددی کنید.
یا اینکه همیشه جای خالی با کاراکتر 0 پر بشه که ظاهرا هم همینطور
شما توی کد SQL خیلی راحت مقایسه کن مثل اعداد.

m-khorsandi
شنبه 16 اردیبهشت 1385, 12:28 عصر
select * from t1
where ttime >= '12:00:00' and ttime <= '14:00:00'




خوب کارشما اشتباه هست.
چرا؟

SH.Daneshvar
شنبه 16 اردیبهشت 1385, 14:31 عصر
درست هست .
البته همونطور که گفتم مشروط به اینکه Format ذخیره تمامی ستون ها به شکل '00:00:00' باشد.
و طول جاهای خالی با 0 پر بشه.

هیچ مشکلی نداره.
یعنی توی منطق Computer و برنامه نویسی حالا شاید MS-SQL Server مثل خود Microsoft
جفتک بندازه!!!...

ghabil
شنبه 16 اردیبهشت 1385, 20:42 عصر
اشتباهه چون مثل این میمونه که برای مقادیر عددی هم آدم یک فیلد رشته ای در نظر بگیره ...
مثلا اگر قرار بشه یک ساعت از کاربر بگیری و تمام رکوردهای که کمتر از 1.5 ساعت باهاش فاصله دارند رو بیاری چی کار میکنی؟:اشتباه:

SH.Daneshvar
دوشنبه 18 اردیبهشت 1385, 11:01 صبح
دوست عزیز مقرون به صرف نیست چون پردازش رشته ها کند تر فضایی که اشغال میکنند بیشتر
کنترل بر خطاهایش سختر.

اما گاهی وقتا شما مجبورید از رشته ها استفاده کنید. به خصوص در مورد تاریخ و ساعت.
و همونطور که گفتم اگر طول یکی باشه و یا جاهای خالی با 0 پر بشود هیچ مشکلی در مقایسه
نیست.
میتونید امتحان کنید.

m-khorsandi
دوشنبه 18 اردیبهشت 1385, 14:11 عصر
اگه جایی رو متوجه نشدی بگو توضیح بدم :چشمک:


Select *
From t1
where DateDiff(minute, '10:00:00', Convert(DateTime, t)) <= 90 and
DateDiff(minute, Convert(DateTime, t), '10:00:00') <= 90


یا



Select *
From t1
where t between Convert(datetime, '10:00:00') - convert(datetime, '1:30') and Convert(datetime, '10:00:00') + convert(datetime, '1:30')

Execution Plan هر دو یه Cost دارند، در مورد پردازش رشته ها هم باز میتونی از این Plan استفاده کنی تا ببینی کند هست یا نه!!!!

ghabil
دوشنبه 18 اردیبهشت 1385, 17:13 عصر
آقا من جدا متاسفم اینجارو اینقدر دیر پیدا کردم ، خدا وکلیلیش بچه های به این پایه ای کمتر پیدا میشند ، یعنی هرچی آدم میگه یک جوابی دارند :متفکر:

من نوشتم استفاده از فیلد String برای مقادیر DateTime غلطه بعدش هم برای اینکه کسی رو که از این روش استفاده کرده رو یکمی متوجه کنم که چرا یک مثال زدم که مثلا متوجه بشه یکی از دلایلی که غلطه اینه که اپراتورها رو هر نوع از اطلاعات تاثیر متفاوت دارند ...
بعد یکی از دوستان لطف کرده اومده طرز استفاده از Cast و Convert رو توضیح داده بعد برداشته دیتای استرینگ رو کرده دیت تایم و ثابت کرده که میشه برای ذخیره همه انواع دیتا از فیلد استرینگ استفاده کرد و بعد زمان استفاده تبدیلشون کرد به نوع اصلیشون.... از اون جالب تر اینکه دو تاروش ارائه داده و مقایسشون کرده در حالی که تو هردو روش دیتا داره تایپکست میشه و نکرده حداقل تو یک روش فیلد رو دیت تایم گرفته باشه و بعد ExecPlanها رو مقایسه کنه و بعد حساب کنه مثلا روی 100 رکورد چقدر فرقش میشه . (نکنه یک وقت طرف احساس کنه اشتباه کرده فیلد رو استریمگ گرفته)
البته من تمام سعیمو کردم متوجه شدم چیزهایی رو که نوشته بود، فقط متوجه نشدم برای چی اینارو نوشته بود؟!:گیج:

یک دوست دیگه هم توضیح داده بود که "مقایسه با کدهای ASCII صورت میگیره پس نتیجه درست میشه" فقط یادش رفته بود که بگه حتی میشه فیلد رو NVarchar گرفت که با کدهای یونیکد مقایسه بشه یکمی بیشتر حال SQL Server نامرد رو بگیریم مگه برق مفت بهش میدیم بره مقایسه عددی بکنه، بزار بشینه هر حرفی رو دو بایت مقایسه کنه حالش جا بیاد.:چشمک:

وقتی یک نفر بیاد تو دلفی به ازای هر باری که میخواد یک فرم رو نشون بده یک Instance بسازه و بعد هم پوینتر فرمرو بیخیال بشه (بدون Free کردن)و اگر دوباره خواست فرم رو نشون بده ، یکی دیگه از روش بسازه نشون بده کارش پیش میره ولی کارش اشتباهه
ماهم که VB نویس نیستیم که هر کاری بکنیم کسی انتظاری نداشته باشه:چشمک: کسی که دلفی کد مینویسه باید یادش باشه که داره کار Enterprice میکنه و این جور کارها برای یک دلفی کار اشتباهه

ولی من باز هم از اینهمه انرژی که دوستان گذاشتن تشکر می کنم بخصوص ExecPlane نهایت کار قشنگ بود .

پ.ن : آقا من نفهمیدم چرا نوشته های ته این تاپیک چندبار پاک شد :اشتباه:

SH.Daneshvar
دوشنبه 18 اردیبهشت 1385, 17:24 عصر
درست اما اگر شما بخواهید تاریخ شمسی رو نگه داری کنید چیکار میکنید ؟
تنها راهش رشته هست و در ضمن CONVERT و CAST و اینجور چیز ها هم روش جواب نمیده.
:لبخند:

ghabil
دوشنبه 18 اردیبهشت 1385, 18:15 عصر
دوست عزیز حتما تاریخ رو بعد از گرفتن از کاربر بصورت DateTime ذخیره کن و بعد از خوندن دوباره به شکل شمسی نشون بده (اصلا OnGetTextو OnSetText برای همین کار هستند )
می ترسم الان دوباره همون بحث اپراتورها رو مثال بزنم برات این دوستمون تو زحمت بیفته یک function TrnsactSql بنویسه که تاریخ رشته ای شمسی رو تبدیل کنه به TDateTime .;) (هرچند زیادم کار سختی نیست)

پ . ن : دوستان مشمول الذمه هستند یک دو سه تا ایراده باحال از این OnGetText نگیریند ها ....

SH.Daneshvar
دوشنبه 18 اردیبهشت 1385, 18:33 عصر
OnGetText باعث کندی میشه. وحشتناکم کند میشه.
البته اگر با چند صد هزارتا سطر که بعدها میشه چند میلیون و 15-10 تا ستون بلند.
اون وقت معنای کند و سریع رو درک میکنید.

در ضمن بدم نمیاد کد SQL تبدیل رو ببینم. این میشه یک راه حل اساسی.

متشکرم.
یا حق.

Valadi
دوشنبه 18 اردیبهشت 1385, 18:38 عصر
خانم سعادتی
من با یک تکنیک ساده آشنا هستم که بتوان این کار را کرد و ضمنا در تمامی دیتا بیس ها جواب می دهد اما درذ حال حاضر دم دست نبود ایمیل بزن تا برایتان بفرستم

ghabil
دوشنبه 18 اردیبهشت 1385, 20:46 عصر
ببین دیگه یکمی ابتکار به خرج بده .....

به هر حال دوست عزیز : هیچ وقت صدها هزار رکورد رو همزمان از دیتابیس فچ نکن ، کار بسیار غلطیه ، در بدترین شرایط و استثنایی ترین موارد استفاده از 10 هزار رکورد اجازه داده شده .
یا از دستور Top در SQL استفاده کن یا از امکانت دلفی مثل Packet REcords ولی به هیچ وجه آوردن اینهمه رکرد در حافظه منطقی نیست .
حالا این نکته مهم رو بیخیال بشیم میرسیم به این نکته که OnGetText فقط برای رکروردهایی که نمایش داده میشند اجرا میشه یعنی حتی اگر 100 هزار رکرود ریخته باشی تو گرید اما طول گیریدت اندازه ای باشه که 10 تا رکورد رو نشون بده فقط 10 بار اجرا میشه ....
لطفا یک مثال دیگه برای من بزن که معنی کند و سریع رو درک کنم چون اینکه ثابت کرد خودت تا حالا زیاد به این چیزا اهمیت نمیدادی .

در مورد کد SQL یک روز صبر کنیم شاید اونیکی دوستمون بخواد باهمون بازی کنه اگه ننوشت چشم من مینویسم اگر اشتباه نکنم 2-3 خط بیشتر نمی شه . ولی راه حل حسابی همون onGetText هست .

تا ببینیم دیگه چه میکنی ؟

m-khorsandi
سه شنبه 19 اردیبهشت 1385, 08:23 صبح
دلیلی برای ناراحتی وجود نداره عزیزم،
توی 100 تا 200 تا 300 و ... Execution Plan یکی ست امیدوارم به سه نقطه دقت کنی،
سعی کن به Execution Plan یه نگاهی بندازی ، بهینه کردن! که جای خود داره، حداقل نوشتنش رو یاد بگیری.
دستور خاصی ننوشتم که نیازی باشه برای درکش تمام سعی ات رو بکنی، البته این موضوع بر میگرده به خودت.

برای فوروم وقت زیاد میگذارم شاید بتونم 1-2 دو تا سئوال رو جواب بدم ولی برای کل کل های
بی مورد(که بعضا" از روی عصبانیت هست مانند همین پستها) وقت نمیگذارم.

این روش خوبی نیست اگه تابع خاصی رو نیاز داری، میتونی درخواست کنی.

با املای قوی دوستمون ghabil خیلی حال میکنم.

تاپیک رو بدون بحثهای بی مورد ادامه بدین.