PDA

View Full Version : سلکت و محاسبه در تاریخ



quantomquery
جمعه 15 شهریور 1392, 16:58 عصر
سلام

یک جدول دوستان دارم


frnd(id,name,BirthDay)

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

نام دوست, تاریخ تولد,تعداد روز های مانده به تولد از امروز

تعداد روز های مانده به تولد از امروز یعنی اینکه چند روز دیگه تولدشه

فک کنم برای تعداد روز های مانده به تولد باید سال تاریخ تولدش رو به امسال (مجازا) تغییر بدم و امروز رو منهای تاریخ تولدش بکنم که تعداد روز باقیمانده رو برام محاسبه کنه


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

ممنون

sajadsobh
جمعه 15 شهریور 1392, 23:50 عصر
توی sql هم میتونی با استفاده از تابع DATEDIFF اختلاف دو تا تاریخ رو بدست بیاری. البته واسه میلادی رو انجام میده، باید اول به میلادی تبدیلش کنی بعد از DATEDIFF استفاده کنی:چشمک:

quantomquery
یک شنبه 17 شهریور 1392, 18:40 عصر
سلام
میشه یه مثال کو چولو برام بزنی - من تاریخ هام رو میلادی ذخیره میکنم

مهدی هادیان2
دوشنبه 18 شهریور 1392, 06:18 صبح
بسم الله الرحمن الرحیم
با سلام
به نظرم بهتره این کار رو در سطح برنامه تون انجام بدید نه پایگاه داده.
موفق باشید.

quantomquery
دوشنبه 18 شهریور 1392, 19:26 عصر
یه عزیزی یه مثال از تابع DATEDIFF برای بدست آوردن اختلاف دو تا تاریخ بزنه ممنون می شم

محمد سلیم آبادی
دوشنبه 18 شهریور 1392, 22:47 عصر
بعید میدونم در اینجا تابع datediff بتونه کاری کنه. چرا که مثلا اگر ما در برج 3 باشیم و تاریخ تولد فرد برج 2 باشه این تابع مقدار 1 (یا -1) برمیگردونه که جواب مورد نظر ما نیست.
به این خاطر که تاریخ تولد فرد مورد نظر 11 ماه بعد هست.

شما میتونید توسط توابع month و day همراه کمی محاسبات به اون چیزیزی که مدنظرتون هست برسید.
البته در net تحقیق کنید ببینید تابعی برای این منظور وجود داره یا خیر.

sajadsobh
دوشنبه 18 شهریور 1392, 22:57 عصر
خب اینکه میلادی ذخیره میکنی بهتره.
ساختارش به این صورته:

DATEDIFF(DatePart, StartDate, EndDate)

StartDate و EndDate که دیگه مشخصه چیه!
DatePart اون قسمتی از تاریخ هست که شما میخوای براساس اون تفاوت دو تا تاریخ رو بدست بیاری. و به جاش میتونی از گزینه های زیر استفاده کنی:
yy: چند سال اختلاف رو نشون میده.
mm: چند ماه اختلاف رو نشون میده.
dd: چند روز اختلاف رو نشون میده.
hh: چند ساعت اختلاف رو نشون میده.
mi: چند دقیقه اختلاف رو نشون میده.
ss: چند ثانیه اختلاف رو نشون میده.

بازم اگه مشکل داشتی بگو :چشمک:

tooraj_azizi_1035
سه شنبه 19 شهریور 1392, 13:38 عصر
باید یک CLR Function بنویسید و در اون رفرنسی مثل FarsiLibrary رو use کنید و بعد این تابع رو در SQL Server استفاده کنید.
راه دیگه اینکه خودتون در SQL تاریخ شمسی رو هندل کنید.

hramezani
چهارشنبه 20 شهریور 1392, 13:52 عصر
کد tsql رو میشه اینطور هم نوشت:
declare @birthDate datetime='2010-9-15'
declare @birthDateCurrent datetime=getdate();

declare @birthMonth int= (select DATEPART(MONTH,@birthDate))
declare @birthDay int= (select DATEPART(day,@birthDate))

declare @currentMonth int= (select DATEPART(MONTH,GETDATE()))
declare @currentDay int= (select DATEPART(day,GETDATE()))

set @birthDateCurrent=case when (@birthMonth<@currentMonth OR (@birthMonth=@currentMonth and @birthDay<@currentDay)) then DATEADD(year,DATEDIFF(YEAR,@birthDate,GETDATE())+1 ,@birthDate)
when (@birthMonth>@currentMonth OR (@birthMonth=@currentMonth and @birthDay>@currentDay)) then DATEADD(year,DATEDIFF(YEAR,@birthDate,GETDATE()),@ birthDate)
else getdate()
end

select 'I think your birthday will be next '+convert(nvarchar(3), DATEDIFF(day,getdate(),@birthDateCurrent))+' days'

که ورودی شما میشه پارامتر @birthDate و البته سعی کردم کد رو تیکه تیکه بنویسم که واضح باشه

محمد سلیم آبادی
جمعه 22 شهریور 1392, 10:42 صبح
در پست قبل به درستی مساله حل شده.
به هر حال میشه تمام این پروسه را فشرده کرد و داخل تابع datediff به این صورت قرار داد:

DATEDIFF(DAY, Today, DATEADD(YEAR, IIF((31 * MONTH(Today) + DAY(Today)) > (31 * MONTH(Birthday) + DAY(Birthday)), 1, 0) + DATEDIFF(YEAR, Birthday, Today), Birthday))