PDA

View Full Version : جستجو مابین دو تاریخ



icmaster
سه شنبه 07 فروردین 1386, 16:00 عصر
سلام
من در دیتابیسم سه فیلد روز، ماه و سال از نوع int دارم
حالا نمیدونم چطوری باید عمل مقایسه رو برای بدست آوردن رکوردهایی که تاریخشان مابین دو تاریخ وارد شده توسط کاربر هست انجام بدم.؟؟
چطوری باید اینکار رو انجام بدم؟؟
آیا امکان پذیر هست؟
کسی کد آماده ای برای اینکار نداره؟
بسیار ممنون.

rezaei manesh
سه شنبه 07 فروردین 1386, 16:54 عصر
خوب این دیگه کد آماده نمی خواد که با دستور where می تونی براحتی انجام بدی


select Year,month,day from yourtable where year >=IntSYear and year <IntEYear and Month >=IntSMonth and Month <IntEMonth and Day >=IntSDay and Day <IntEday

icmaster
سه شنبه 07 فروردین 1386, 18:59 عصر
عزیزم به این سادگی ها هم نیست
اینو خودم بلدم
این کدی که تو نوشتی مثلا تاریخ بین 1/1/1385 تا 1/1/1386 رو نمیتونه جواب بده چون روز و ماه دو تاریخ با هم برابره.
منظورمو فهمیدی؟
یعنی مثلا تو شرطی که تو نوشتی مگه میشه روز هم بزرگتر مساوی 1 باشه هم کوچکتر از یک!!

linux
سه شنبه 07 فروردین 1386, 19:29 عصر
سلام
من در دیتابیسم سه فیلد روز، ماه و سال از نوع int دارم
حالا نمیدونم چطوری باید عمل مقایسه رو برای بدست آوردن رکوردهایی که تاریخشان مابین دو تاریخ وارد شده توسط کاربر هست انجام بدم.؟؟
چطوری باید اینکار رو انجام بدم؟؟
آیا امکان پذیر هست؟
کسی کد آماده ای برای اینکار نداره؟
بسیار ممنون.
خوب! چرا اینکار را کردی که الان توی این مشکل گیر کنی؟ رو چه حساب کتابی؟چه کاربردی داره این کار برای شما؟
بهترین راه : این 3 تا فیلد را به یک فیلد از نوع datetime تبدیل کنید تاریخ ها را بصورت میلادی ذخیره کنید و بصورت شمسی نمایش دهید در این صورت از تمام توابع که برای کار کردن با نوع datetime در sql هست می توانید استفاده کنید. توابع تبدیل را هم می توانید در این بخش پیدا کنید.
راه حل موقتی :


ALTER FUNCTION dbo.persian_jdn
(@iYear bigint, @iMonth int, @iDay int)
RETURNS bigint AS
BEGIN
DECLARE @PERSIAN_EPOCH bigint
SET @PERSIAN_EPOCH = 1948321 -- The JDN of 1 Farvardin 1
DECLARE @epbase bigint
DECLARE @epyear bigint
DECLARE @mdays bigint
DECLARE @temp bigint
IF @iYear >= 0
SET @epbase = @iYear - 474
ELSE
SET @epbase = @iYear - 473

SET @epyear = 474 + dbo.MMod(@epbase, 2820)
IF @iMonth <= 7
SET @mdays = (@iMonth - 1) * 31
ELSE
SET @mdays = (@iMonth - 1) * 30 + 6

SET @temp = @iDay + @mdays + CAST(((@epbase / 2820) * 1029983 + (@PERSIAN_EPOCH - 1)) AS bigint)
RETURN @temp + CAST(((((@epyear * 682) - 110) / 2816) + (@epyear - 1) * 365) AS bigint)
END

از این تابع استفاده کنید.این تابع روز های گذشته از مبدا jdn را محاسبه می کند
به این صورت استفاده کنید

select Year,Month,Day
where dbo.persian_jdn(year,month,day )< dbo.Perisan_jdn(1386,1,1)

icmaster
سه شنبه 07 فروردین 1386, 21:22 عصر
خوب! چرا اینکار را کردی که الان توی این مشکل گیر کنی؟ رو چه حساب کتابی؟چه کاربردی داره این کار برای شما؟



چون می خواستم از کریستال ریپورت هم استفاده کنم فکر می کردم اینجوری ساده تر باشه ولی ....


ممنون از شما.

linux
چهارشنبه 08 فروردین 1386, 02:01 صبح
چون می خواستم از کریستال ریپورت هم استفاده کنم فکر می کردم اینجوری ساده تر باشه ولی ....
ممنون از شما.
در اولین فرصت این را اصلاح کنید

iran400
چهارشنبه 08 فروردین 1386, 05:30 صبح
سلام
سال نو مبارک
خیلی خوبه که می‌بینم دوستان دارند روی تاریخ شمسی سرمایه گذاری می‌کنند.

select Year,month,day from yourtable where Year+month+day >=IntSYear + IntSMonth + IntEMonth and Year+month+day <=IntSYear + IntSMonth + IntEMonth

موفق باشید

rezaei manesh
چهارشنبه 08 فروردین 1386, 07:56 صبح
درسته حق با شماست اما می تونی از کد دوستمون iran400 استفاده کنی البته با کمی تغییر که اونها رو به یه فرمت استاندارد تبدیل کنه مثل 10 رقمی
اما من اصلا با این روش ذخیره تاریخ موافق نیستم .
شما اگه کار با تاریخ و محاسباتت زیاد هست بهتر اونو میلادی ذخیره کنی و اگه زیاد نیست اونو به صورت یک فرمت ثابت مثلا 10 رقمی از نوع رشته ذخیره کن و این جور شروط رو روی اون خیلی ساده انجام بده
درباره نوع ذخیره سازی تاریخ هم ما تویه یه تاپیک مفصلا با بچه ها بحث کردیم و بچه ها هر کدوم نظراتشون رو گفتن جستجو کن و اونو بخونی بد نیست
موفق باشی

SYNDROME
چهارشنبه 08 فروردین 1386, 08:26 صبح
با سلام
مثالی که دوستمان مطرج کرد تا حدودی درست است مانند:
تاریخ اول : 8512
تاریخ دوم : 8592
ولی در مثال زیر صادق نیست :
تاریخ اول : 851212
تاریخ دوم : 8611
و برنامه درست کار نمی کند:
ولی من در برنامه هایی که تا بحال نوشته ام از روش زیر استفاده کرده ام :
دو رقم روز / دو رقم ماه / دو رقم سال
یعنی
تاریخ اول : 12/12/85
تاریخ دوم : 01/01/86
و حالا می بینی که همه چیز درست است.
من در کل برنامه هایی که نوشته ام از این روش استفاده کرده ام و خیلی خوب جواب داده است.
---------------------------------------
شب بود و شمع بود و من بودم و غم*شب رفت و شمع سوخت و من ماندم و غم

icmaster
چهارشنبه 08 فروردین 1386, 12:23 عصر
در اولین فرصت این را اصلاح کنید

چرا؟؟؟؟؟؟!!!


سلام
سال نو مبارک
خیلی خوبه که می‌بینم دوستان دارند روی تاریخ شمسی سرمایه گذاری می‌کنند.

select Year,month,day from yourtable where Year+month+day >=IntSYear + IntSMonth + IntEMonth and Year+month+day <=IntSYear + IntSMonth + IntEMonth

موفق باشید

سال نو شما هم مبارک.
خوب این الگوریتم که اشتباهه.


درسته حق با شماست اما می تونی از کد دوستمون iran400 استفاده کنی البته با کمی تغییر که اونها رو به یه فرمت استاندارد تبدیل کنه مثل 10 رقمی
اما من اصلا با این روش ذخیره تاریخ موافق نیستم .
شما اگه کار با تاریخ و محاسباتت زیاد هست بهتر اونو میلادی ذخیره کنی و اگه زیاد نیست اونو به صورت یک فرمت ثابت مثلا 10 رقمی از نوع رشته ذخیره کن و این جور شروط رو روی اون خیلی ساده انجام بده
درباره نوع ذخیره سازی تاریخ هم ما تویه یه تاپیک مفصلا با بچه ها بحث کردیم و بچه ها هر کدوم نظراتشون رو گفتن جستجو کن و اونو بخونی بد نیست
موفق باشی

اگه تاریخ رو بصورت رشته ذخیره کنیم اونوقت چطوری شروط بزگتر، کوچکتر را روش چک کنیم؟ مگه میشه؟؟

icmaster
چهارشنبه 08 فروردین 1386, 12:26 عصر
با سلام
مثالی که دوستمان مطرج کرد تا حدودی درست است مانند:
تاریخ اول : 8512
تاریخ دوم : 8592
ولی در مثال زیر صادق نیست :
تاریخ اول : 851212
تاریخ دوم : 8611
و برنامه درست کار نمی کند:
ولی من در برنامه هایی که تا بحال نوشته ام از روش زیر استفاده کرده ام :
دو رقم روز / دو رقم ماه / دو رقم سال
یعنی
تاریخ اول : 12/12/85
تاریخ دوم : 01/01/86
و حالا می بینی که همه چیز درست است.
من در کل برنامه هایی که نوشته ام از این روش استفاده کرده ام و خیلی خوب جواب داده است.
---------------------------------------
شب بود و شمع بود و من بودم و غم*شب رفت و شمع سوخت و من ماندم و غم

منظورت چطوریه؟
میشه بیشتر توضیح بدی؟

rezaei manesh
چهارشنبه 08 فروردین 1386, 12:49 عصر
اگه تاریخ رو بصورت رشته ذخیره کنیم اونوقت چطوری شروط بزگتر، کوچکتر را روش چک کنیم؟ مگه میشه؟؟

به راحتی هر چه تمام تر شما تاریخ ها را با یک فرمت مشخص مثل 1362/01/23 در یک فیلد نوع char 10 ذخیره کن و با دستورات ><= و <> هر کاری که خواستی می تونی روش انجام بدی

iran400
چهارشنبه 08 فروردین 1386, 17:36 عصر
سلام
کمی هم ابتکار عمل به خرج بدهید بد نیست

select Year,month,day from yourtable where Year+"0"+month+"0"+day >=IntSYear +"0"+IntSMonth +"0"+ IntEMonth and Year+"0"+month+"0"+day <=IntSYear +"0"+ IntSMonth +"0"+ IntEMonth

rezaei manesh
چهارشنبه 08 فروردین 1386, 17:43 عصر
سلام
کمی هم ابتکار عمل به خرج بدهید بد نیست

select Year,month,day from yourtable where Year+"0"+month+"0"+day >=IntSYear +"0"+IntSMonth +"0"+ IntEMonth and Year+"0"+month+"0"+day <=IntSYear +"0"+ IntSMonth +"0"+ IntEMonth

این ابتکار شما هم بدرد نمی خوره دوست عزیز (مثلا 85012023) باید چک کنی اگه یک رقمی هست یه صفر پیشش بذاری
البته با ابتکار بخرج دادن موافقم

SYNDROME
چهارشنبه 08 فروردین 1386, 20:45 عصر
با سلام
ما که کردیم شد ، شما بکنید ببینید می شه.(حتماً می شه)
-----------------------------------------------------------------
جور دیگر باید دید.

SYNDROME
چهارشنبه 08 فروردین 1386, 20:50 عصر
با سلام
البته که ابتکار به خرج دادن خوبه ولی دقت به حرف ما هم بکن عزیز بابا.
گفتم دو رقم نه سه رقم و یا یک رقم.
دو رقم روز/دو رقم ماه/دو رقم سال
مثال
01/01/85
12/03/85
29/12/85
حالا خلاقیت خودته که چطور این کار را بکنی چند تا IF ساده.
مطمئن باش من تا روشی را هزاران بار و در برنامه های مختلف چک نکرده باشم به هیچ کسی پیشنهاد نمی دم.
----------------------------
جور دیگر باید دید.

rezaei manesh
پنج شنبه 09 فروردین 1386, 08:42 صبح
آقا ما داریم راجع به برنامه این دوستمون صحبت می کنیم و یه سلکت می خوایم بنویسیم که مشکل دوستمون حل بشه ما کاری به روش شما نداریم شما که 2 رقم 2رقم دارید مشکل ندارید
باید سلکتی رو برای داده های دوستمون بنویسیم
از دستور case تو سلکت باید استفاده کنی و..
بعد ما تو محیط sql هر بانک دیگه ای می خوایم نه تو محیط برنامه نویسی ...
روش شما هم که هزاران بار امتهان کردی درسته چون روش ذخیره سازیت درسته و...

linux
پنج شنبه 09 فروردین 1386, 13:06 عصر
چرا؟؟؟؟؟؟!!!

چرا نداره چون کاری انجام دادی که فقط مشکلات شما را زیادتر کرده و بعد از مدتی که حجم دیتابیس شما زیاد شد تازه می فهمی که تو چه دردسری افتادی.
شرط می بندم برنامه ات را از روی فرم کاغذی طراحی کردی که توش روز--- ماه---سال--- بوده برداشتی همانطور توی دیتابیس فیلد ساختی

SYNDROME
پنج شنبه 09 فروردین 1386, 23:40 عصر
با سلام
پیروی نوشته های Linux عزیز و تایید حرف ایشان:
ما در برنامه نویسی یادگرفته درست فکر کنیم و کار را از پایه درست انجام دهیم. حالا این دوستمان کاری کرده است درست یا غلط ما کاری نداریم و فقط روشهای صحیح را سعی می کنیم به او بگوییم.حال به طور مثال اگر روش دوست عزیز ما اشتباه است به جای اینکه این راه اشتبا ه را ادامه دهد و در آینده با مشکلات بیشتری برخورد کند اگر یک بازنگردی در برنامه بکند در آینده دچار مشکلات بیشتری نخواهد شد و سیستم را از حالت نورمال خارج نمی کند.به جای کلیه نوشته های بالا می توانیم از کلمه آینده نگری استفاده کنیم.
شرمنده از اینکه موضوع خارج از بحث انجام دادم و خارج از قوانین سایت عمل کردم :خجالت: ولی احساس کردم لازم است.:چشمک:

icmaster
جمعه 10 فروردین 1386, 00:47 صبح
چرا نداره چون کاری انجام دادی که فقط مشکلات شما را زیادتر کرده و بعد از مدتی که حجم دیتابیس شما زیاد شد تازه می فهمی که تو چه دردسری افتادی.
شرط می بندم برنامه ات را از روی فرم کاغذی طراحی کردی که توش روز--- ماه---سال--- بوده برداشتی همانطور توی دیتابیس فیلد ساختی

البته میدونم کارم اشتباه بوده ولی میشه بگی چرا وقتی حجم دیتابیس زیاد بشه بر به مشکل میخورم؟؟
از نظر سرعت منظورته دیگه؟


(البته تو این برنامه از حالا میدونم که رکوردها حداکثر حدود 1500 تا خواهد بود)

راستی از رو فرم کاغذ طراحی نکردم...خودمم نمیدونم چرا اینجوری به فکرم رسید، احتمالا از بی تجربگی بوده)

linux
جمعه 10 فروردین 1386, 01:39 صبح
البته میدونم کارم اشتباه بوده ولی میشه بگی چرا وقتی حجم دیتابیس زیاد بشه بر به مشکل میخورم؟؟
از نظر سرعت منظورته دیگه؟


(البته تو این برنامه از حالا میدونم که رکوردها حداکثر حدود 1500 تا خواهد بود)

راستی از رو فرم کاغذ طراحی نکردم...خودمم نمیدونم چرا اینجوری به فکرم رسید، احتمالا از بی تجربگی بوده)
از نظر سرعت و پیچده شدن queryها

iran400
جمعه 10 فروردین 1386, 04:10 صبح
با سلام به تمامی دوستان

مثالی که بنده زدم درست کار می‌کند
قراره که مسئله حل بشه و دوستمون به جواب برسند حالا دیگه اعداد یک رقمی یا دو رقمی هست یا چرا صفر وسطش هست مهم نیست
فقط دوستمون باید توجه کنند که مقدار ورودی دقیقا مطابق با مقدار دیتابیس باشد
مثلا وقتی که روز را داخل دیتابیس یک رقمی و مثلا 3 ذخیره کردند موقع جستجو هم عدد 3 را وارد کنند نه 03

:)

موفق و پیروز باشید

reza_optical
دوشنبه 13 فروردین 1386, 01:27 صبح
چرا؟؟؟؟؟؟!!!



سال نو شما هم مبارک.
خوب این الگوریتم که اشتباهه.



اگه تاریخ رو بصورت رشته ذخیره کنیم اونوقت چطوری شروط بزگتر، کوچکتر را روش چک کنیم؟ مگه میشه؟؟

بله چرا نشه مثلا من خودم تمامی تاریخ هامو به صورت 10 رقم char گرفتم و هنگام جستجو بین دو تاریخ از Between استفاده میکنم خوبه خوب هم جواب میده