PDA

View Full Version : تابع Datepart



هواشناس
سه شنبه 05 آبان 1388, 13:49 عصر
بنام خدا
با سلام
ديتا بيسي دارم بر اساس تاريخ ميلادي
ميخاستم ببينم چطئري گزارش مثلا اهانه شمسي ازش بگيرم در ديتا بيس داده هاي مثلا 10 سال ميلادي بفرمت مثلا 1900/12/12 وجود داره تابعي هم براي تبديل ميلادي به شمسي دارم
اما ميخام ببينم تابعي مثلي datepart وجود داره يا ساختاري از اون

ممنون

aryaei2000
سه شنبه 05 آبان 1388, 18:32 عصر
منظورتون اینه که میخواید ببینید با Datepart میشه شمسیش کرد یا نه؟
اگه منظورتون رو درست متوجه نشدم معذرت میخوام.
موفق باشید.

هواشناس
چهارشنبه 06 آبان 1388, 08:14 صبح
بنام خدا
با سلام و تشكر
چيزي كه ميخايتم به اين صورت هست
جدولي دارم بنام TBL كه در اون اطلاعات روزانه ريخته ميشه با فيلد Gdate براي تاريخ شمسي و Sdate‌براي تاريخ ميلادي و مثلا Param براي اطلاعات داده اي روزانه- اين بانك شامل اطلاعات روزانه در طي سال مثلا 10 سال مي باشد كه روزانه اضافه ميشود
خب نياز به يك سري گزارش گيري روزانه - هفتگي - ماهانه - فصلي و سالانه دارم
براي اين منظور جداول weeklyشامل فيلد wk‌با مقادير 1 تا 54 و Monthly‌ با فيلد Mnt با مقادير 1 تا 12 و Yearly با مقادير 1920 تا 2020‌ و در نهايت Seasonly با فيلد Season با مقدار 1 تا 4 كه در دستورات sql از اونها بروش زير استفاده كردم

در مدل گزارش گيري ميلادي بفرمتهاي زير دستورات رو نوشتم و جواب داده كه البته خواهش ميكنم اگه دستورات مفيدتر و بهينه تري نسبه به اين ها در گزارشگيري ميلادي مي تونيد بنويسيد بفرمائيد استفاده كنيم



MDate1=Special Milady Date 1
MDate2=Special MIlady Date 2

Report In Special Year according to Mdate1(for example: 1980/01/01)

Daily Report Sql:
"select TBL.Param from TBL where TBL.gdate =#"&cdate(MDate1)&"#"

Weekly In Special Year Report Sql:
"select TBL.Param,Weekly.wk from TBL,weekly where cint(format(Tbl.Gdate,'yyyy'))="&cint(year(Mdate1))&" and datepart('ww',Tbl.Gdate,2)=Weekly.wk GROUP BY Weekly.wk Order BY Weekly.wk"

Monthly In Special Year Report Sql:
"select TBL.Param,monthly.mnt from TBL,monthly where cint(format(TBL.Gdate,'yyyy'))="&cint(year(Mdate1))&" and datepart('m',TBL.Gdate)=Monthly.mnt GROUP BY Monthly.mnt Order BY Monthly.mnt"



Seasonly In Special Year Report Sql:
"select TBL.Param,Yearly.yr,Seasonly.Season from TBL,yearly,Seasonly where cint(format(TBL.Gdate,'yyyy'))=Yearly.yr and cint(format(TBL.Gdate,'m')) between Seasonly.mnt1 and Seasonly.mnt3 GROUP BY Yearly.yr,Seasonly.Season Having Yearly.yr ="&year(Mdate1)&" Order BY Seasonly.Season"

که mnt1 و mnt3 شماره شروع و خاتمه ماههاي ميلادي در فصل مورد نظر مي باشد


Yearly In Special Year Report Sql:
"select TBL.Param,Yearly.yr from TBL,yearly where cint(format(TBL.Gdate,'yyyy'))="&year(Mdate1)



و اما مشكلي دوم و اصلي در تعيين گزارشگيري شمسي است
اولا گفته باشم كه تابعي دارم كه بوسيله اون براحتي شمسي رو به ميلادي و بالعكس تبديل ميكنم ولي ميدونيد بدليل اختلاف در شروع ابتداي سال ميلادي و روز شروع هفته و تعداد روزهاي ماه هاي ميلادي با شمسي از دستورات فوق نمي شه استفاده كرد اگه بخواهم اينجوري تعريف كنم كه از تاريخ فلان تا فلان براي مهر و ال آخر ، خب دستور سنگين و طويل ميشه و اگر در جدولي ماه هاي شمسي رو با تاريخ هاي مربوطه مشخص كنم باز مثل همين مورد
شما چه مي فرماييد من كه دارم روي اون فكر مي كنم اگه شد شما هم فكر كنيد شايد زودتر از من به نتيجه رسيديد

ممنون
يا علي

هواشناس
چهارشنبه 06 آبان 1388, 12:17 عصر
بنام خدا
من دستورات گفته شده رو برا حالت شمسي نوشتم و اجرا كردم
دستورات زير كه البته كاملتر از بالايي هاست با resposne,write("sql") توليد شده اند و درست كار كردند
اما مشكل در سرعت اجرا بخصوص قسمت seasonly هست البته در قسمت هفتگي weekly مشكل هنوز وجود داره؟
كد بهتري سراغ داريد كه بهينه تر باشه


MDate1=Special Milady Date 1
MDate2=Special MIlady Date 2
SDate1=Special Shamsi Date 1
SDate2=Special Shmasi Date 2

Report In Special Year according to Sdate1(for example: 1388/01/01)

Daily Report Sql:
"select TBL.Param from TBL where TBL.gdate =#"&cdate(MDate1)&"#"

Weekly In Special Year Report Sql:
????????????????
گير در شماره هفته ميلادي با شمسي تابع datepart شماره هفته ميلادي برميگرداند لذا کاربستن اون با تاريخ ميلادي معادل
شماره هفته اشتباه ميده و بکاربستن اون با تاريخ شمسي از اون بدتر چون که تاريخ 1388.1.1 را بعوان ميلادي قلمداد ميکنه
؟؟؟؟؟؟؟؟؟؟
select min(TBL.Param) as Condition1,max(TBL.Param) as Condition2,sum(TBL.Param) as Condition3,avg(TBL.Param) as Condition4,count(TBL.Param) as Condition5,Weekly.wk AS WeekId From TBL,weekly where cint(left(TBL.Sdate,4))=1388 and datepart('ww',TBL.Gdate,7)=Weekly.wk GROUP BY Weekly.wk Order BY Weekly.wk



Monthly In Special Year Report Sql:

select min(TBL.Param) as Condition1,max(TBL.Param) as Condition2,sum(TBL.Param) as Condition3,avg(TBL.Param) as Condition4,count(TBL.Param) as Condition5,Monthly.mnt as Monthid From TBL,monthly where cint(left(TBL.Sdate,4))=1388 and cint(mid(TBL.Sdate,6,2))=Monthly.mnt GROUP BY Monthly.mnt Order BY Monthly.mnt



Seasonly In Special Year Report Sql:
select min(TBL.Param) as Condition1,max(TBL.Param) as Condition2,sum(TBL.Param) as Condition3,avg(TBL.Param) as Condition4,count(TBL.Param) as Condition5 ,Seasonly.Season as SeasonId From TBL,yearly,Seasonly where cint(left(TBL.Sdate,4))=1388 and cint(mid(TBL.Sdate,6,2)) between Seasonly.mnt1 and Seasonly.mnt3 Group By Seasonly.Season Order BY Seasonly.Season



که mnt1 و mnt3 شماره شروع و خاتمه ماههاي ميلادي در فصل مورد نظر مي باشد


Yearly In Special Year Report Sql:
select min(TBL.Param) as Condition1,max(TBL.Param) as Condition2,sum(TBL.Param) as Condition3,avg(TBL.Param) as Condition4,count(TBL.Param) as Condition5 From 40768,yearly where cint(left(TBL.Sdate,4))=1388



يا علي مدد

kashaneh
چهارشنبه 06 آبان 1388, 15:08 عصر
دوست عزیز وقتی شما میتونید توسط تابع تاریخ شمسی خود رو به میلادی تبدیل کنید، خب همون گزارش گیری میلادی رو برای تاریخ شمسی هم میشه استفاده کرد...درسته!؟

هواشناس
پنج شنبه 07 آبان 1388, 08:15 صبح
بنام خدا
با سلام تشكر
مشكل من همون جور كه گفتم در گزارش گيري با كمترين كد هست
مي تونم مثلا برا گزارش گيري هفتگي شمسي حلقه بذارم و بگم از تاريخ فلان تا فلان با گام مثلا 7 روزه يا موارد مشابه كه قبلا داشتم
ولي ميخواستم از قابليت هاي SQL استفاده كنم كه هم سرعتش خوب باشه هم بهينه تر باشه

پيشنهاد شما برا بهينه تر شدن ميلادي و شمسي ها چيه

هواشناس
یک شنبه 10 آبان 1388, 12:31 عصر
بنام خدا
همه كدهاي مورد نياز گزارشگيريم رو درست كردم الا گزارش گيري هفتگي در حالت كلي
اگه كسي ميتونه كمك كنه
متشكر


توضيحات:
ديتابيس شامل يك جدول بنام weekly با فيلد wk شامل اعداد 1 تا 54 بعنوان شماره هاي هفته در سال
و شامل يك جدول بنام مثلا tbl شامل فيلد تاريخ ميلادي GDate بفرمت date/time مثل 01-01-2009 و فيلد تاريخ شمسي SDate بفرمت text مثل 01-01-1388 و فيلد داده مورد نظر مي باشد

گزارش گيري ميلادي در يك سال -كه بدرستي كار مي كنه
mdate تاريخ درخواستي كاربر هست



myr=year(cdate(mdate))
where cint(format(TBL.Gdate,'yyyy'))=myr and datepart('ww',TBL.Gdate,2)=Weekly.wk GROUP BY Weekly.wk Order BY Weekly.wk

گزارش گيري شمسي در يك سال -كه بدرستي كار مي كنه البته يكم كندتر از ميلادي



Mdate1=معادل اول فروردین سال مورد نظر

Mdate2=معادل اول فروردین یک سال بعد

where (TBL.Gdate between #"&Mdate1&"# and #"&Mdate2&"#) and (datediff('d',#"&mdate1&"#,TBL.Gdate)\7=weekly.wk-1) group by weekly.wk"


گزارش گيري ميلادي در چند سال -كه بدرستي كار مي كنه
mdate تاريخ درخواستي كاربر هست


myr=year(cdate(mdate))
where (datepart('ww',TBL.Gdate,1)=Weekly.wk) and (datepart('yyyy',TBL.Gdate) between myr-5 and myr) GROUP BY Weekly.wk Order BY Weekly.wk



گزارش گيري شمسي در چند سال -كه گير داره و كار نمي كنه
بايستي مثلا حداقل مقدار رو در هفته اول 5 سال بدست بياره يعني در مقادير هفته هاي اول سايهاي 80 تا 85 مينيمم رو بيان كنه و الي آخر



؟؟؟؟؟؟؟؟؟؟

يا علي مدد

kashaneh
یک شنبه 10 آبان 1388, 23:46 عصر
دوست عزیز به عنوان پیشنهاد به این موارد دقت کنید و اعلام نظر کنید :

1 - با توجه به اینکه از برخی از فیلدها در پرس و جوهای خود زیاد استفاده می کنید، توصیه اکید! می کنم آن فیلد یا فیلدها را از نوع شاخص (index) در نظر بگیرید... با این عمل سرعت عملیات جستجوی شما بر اساس آن فیلد (ها) به طور قابل توجهی بالا خواهد رفت... البته فراموش نشود این شاخص گذاری باعث می شود حجم دیتابیس افزایش یابد که با رعایت مورد 2 و مزیت شاخص گذاری، قابل گذشت است!...

2 - در مورد فیلد تاریخ شمسی تجربه شخصی نشان می دهد چنانچه آن را از نوع عددی بگیرید بسیار بهتر است(هم از لحاظ حجم ذخیره داده ها، هم از لحاظ امکان شاخص گذاری و هم از لحاظ مدیریت و جستجوهای دقیق تر)... برای مثال در اکسس آنرا از نوع long int در نظر بگیرید و تاریخ رو بصورت مجموعه اعداد مثل 13880815 ذخیره سازی کنید (دورقم روز دورقم ماه چهاررقم سال) و یا قالب های مشابه... در این حالت برای ذخیره این تاریخ 4 بایت استفاده می شود در حالیکه برای حالت متنی 15-08-1388 که شما گفتید، مقدار 10 بایت فضا مصرف می شود... حال این 6 بایت اضافه را در کل رکوردهای خود ضرب کنید و پی به بقیه ماجرا ببرید... ضمن اینکه امکان شاخص گذاری روی فیلدهای متنی به خوبی فراهم نیست...

** در صورت امکان تغییرات را اعمال و نتیجه را بیان کنید **

موفق باشی