PDA

View Full Version : مشكل با دستور DatePart



ASPX
یک شنبه 07 شهریور 1389, 09:59 صبح
ما يك مشكل براي بدست آوردن چندمين هفته سال داريم :

به عنوان مثال



print getdate()
print datepart(ww,getdate())


بايد هفته 34 ام را نمايش بدهد ولي خروجي ما 36 است ؟
اين هم خروجي تابع ماست



Aug 29 2010 10:22AM
36


داريم كلافه ميشيم!!!!

AminSobati
یک شنبه 07 شهریور 1389, 21:31 عصر
سوالتون کمی مبهمه. تاریخ میلادی یا شمسی؟ ضمنا شما دارین تاریخ روز رو با GetDate پاس میکنین، آیا عدد 36 اشتباهه؟

ASPX
دوشنبه 08 شهریور 1389, 10:53 صبح
ببينيد
درست اينه كه اگه نوشتيم در چندمين هفته از سال هستيم براي تاريخ (امروز) بگه 35 ام!


http://whatweekisit.com/


حالا مگه اين دستور نبايد بگه 35 ؟ چرا 36 نشون ميده؟ امروز 30 آگوست 2010 است



print datepart(ww,'2010-8-30')


خروجي بايد 35 باشد

AminSobati
چهارشنبه 10 شهریور 1389, 17:08 عصر
من پیشنهاد میکنم تقویم کامپیوترتون رو تغییر بدین و نتیجه این تابع رو خودتون تست کنین. در مورد دقت اون سایتی که معرفی کردین من اطلاعی ندارم. ولی خوشحال میشم نتیجه تحقیقتون رو پست کنین

ASPX
پنج شنبه 11 شهریور 1389, 08:25 صبح
استاد ثباتي من روي چند تا سيستم ديگه هم تست كردم شما هم رو سيستمتون تست كنيد گويا باگي وجود داره يا ما داريم اشتباه ميكنيم؟!

ببينيد اكثر سايتهاي نمايش تقويم ميگند ما هفته 35 هستيم :

http://www.google.com/#hl=en&source=hp&q=What+week+of+the+year&btnG=Google+Search&aq=f&aqi=&aql=&oq=What+week+of+the+year&gs_rfai=&pbx=1&fp=1

ما مشكل رو از طريق برنامه نويسي حل كرديم و ديگه از اين تابع استفاده نميكنيم ولي برامون جالبه كه چرا اس كيو ال هفته را اشتباه نشون ميده ؟

بهزادصادقی
جمعه 12 شهریور 1389, 01:56 صبح
اولین روز سال جاری میلادی، یعنی اول ژانویه 2010، یک روز جمعه بود. سوال اینجاست که این برنامه ها و سایت های مختلف که تشخیص می دهند که هر روز متعلق به چندمین هفته سال می باشد این روز را متعلق به کدام هفته سال 2010 میلادی می دانند؟

جواب SQL Server منطقی به نظر میرسد:



print datepart(ww,'2010-01-01');


جواب می دهد 1. یعنی هفته اول سال.

ولی سایت www.whatweekisit.com چوابش عجیب است. اگر شما از تقویم آن سایت استفاده کنید و روز مورد نظر خود را اول ژانویه 2010 لحاظ فرمائید، خواهید دید که این سایت این روز را جزء هفته 53 سال به حساب می آورد. نه تنها این، بلکه این سایت روزهای دوم و سوم ژانویه را نیز پاره ای از هفته 53 می شمارد. ولی از دوشنبه، چهارم ژانویه، این سایت هفته اول سال را شروع به حساب کردن می کند.

اگر کد ذیل را در SQL Server Management Studio اجرا نمائید، فکر کنم متوجه شوید جریان از چه قرار است:



print datepart(ww,'2010-1-1');
print datepart(ww,'2010-1-2');
print datepart(ww,'2010-1-3');
print datepart(ww,'2010-1-4');
print datepart(ww,'2010-1-5');
print datepart(ww,'2010-1-6');
print datepart(ww,'2010-1-7');
print datepart(ww,'2010-1-8');


در آمریکا، روز یکشنه روز اول هفته به حساب می آید. اول ژانویه امسال حمعه بود. دوم ژانویه شنبه بود. SQL Server این دو روز را چزو هفته اول سال حساب می کند. روز سوم ژانویه یکشنبه بود. در تقویم آمریکا، این آغاز یک هفته جدید است، پس SQL Server می آید و آن روز را جزو هفته دوم سال حساب می نماید. پس از دیدگاه SQL Server، هفته اول سال 2010 میلادی دو روز در آن دارد. هفته دوم سال هم از روز سوم سال شروع می شود و مثل همه هفته های بعد (به غیر از آخرین هفته سال) هفت روز در آن دارد.

خوب، فرض کنید شما این را دوست نداشتید و ترجیج می دهید که SQL Server هفت روز اول امسال را جزء هفته اول آن حساب کند، هفت روز بعدی را به حساب هفته دوم سال بگذارد و به غیره. یا فرض کنید شما می گویید چون ما تو ایران هستیم، ترجیح می دهید که روز اول هفته همان شنبه خودمان باشد. به عبارت دیگر، شما می خواهید که SQL Server روز اول ژانویه را که یک جمعه بود به عنوان آخرین روز هفته اول سال حساب کند، ولی روز شنبه دوم ژانویه را روز اول هفته دوم سال به شمار آورد.

شما می توانید کاری کنید که SQL Server به وفق مراد شما این محاسبات را انحام دهد. کافی است که به او بگویید کدام روز هفته را روز اول هفته حساب کند. دستور



print @@datefirst;


به شما می گوید که در حال حاضر SQL Server کدام روز هفته را روز اول آن لحاظ می کند. به صورت default، این function، یعنی تابع datefirst@@ ، ارزشش عدد 7 می باشد. برای SQL Server، اینحا عدد 1 یعنی روز دوشنبه، 2 یعنی سه شنبه، و غیره تا 6 که یعنی شنبه و 7 که یعنی یکشنبه. پس وقتی datefirst@@ می گوید 7، یعنی SQL Server روز اول هفته را یکشنبه می داند. شما می توانید این را عوض کنید. مثلا، اگر با استفاده از دستور ذیل به SQL Server بگوئید که روز اول هفته جمعه باید باشد، آن وقت می بینید که هفت روز اول سال یکدفعه همه جزو هفته اول به حساب می آیند:



set datefirst 5; -- Friday

print @@datefirst; --> 5, meaning Friday

print datepart(ww,'2010-1-1'); -- 1
print datepart(ww,'2010-1-2');
print datepart(ww,'2010-1-3');
print datepart(ww,'2010-1-4');
print datepart(ww,'2010-1-5');
print datepart(ww,'2010-1-6');
print datepart(ww,'2010-1-7');

print datepart(ww,'2010-1-8'); -- 2

print datepart(ww,'2010-8-30'); --> Now 35