View Full Version : سوال: درباره تاریخ
zssmoa
چهارشنبه 24 شهریور 1389, 12:34 عصر
با سلام
من یک فیلد از نوع date&time دارم که تاریخ عضویت اعضا را نشان می دهد می خواهم بعد از یک سال اعلام کند که عضویت شما باید تمدید شود تاریخ را به صورت شمسی ذخیره کرده ام چطور می توانم این کار را انجام بدهم
با تشکر
zssmoa
چهارشنبه 24 شهریور 1389, 14:42 عصر
دوستان لطفا راهنماییم کنید
بهزادصادقی
چهارشنبه 24 شهریور 1389, 14:48 عصر
شما می توانید یک کد بنویسید که هر روز چک می کند ببیند تاریخ تمدید کدام اعضا نزدیک است. تاریخ تمدید را یا می توانید به صورت یک ستون به جدول خود اضاقه کنید، یا کد شما می تواند با اجرای یک دستور select لیست تمام اعضایی که تاریخ عضویتشان یک سال پیش بوده را به شما بدهد.
مفهوم واقع شد، یا توضیحات بیشتری بدهم؟
zssmoa
یک شنبه 28 شهریور 1389, 10:49 صبح
با تشکر
همین مقایسه کردن رو که فرمودین ! آیا تابع خاصی داره یا باید تاریخ شمسی رو به میلادی تبدیل کنم و با گرفتن gatedate امروز به کمک between مقایسه کنم؟
behrouzlo
یک شنبه 28 شهریور 1389, 11:30 صبح
فکر کنم نمی شه روی فیلد date&time، تاریخ شمسی را ذخیره کرد آیا مطمئن هستید که فیلد از نوع date&time
هست.
یک راه این هست که تاریخ شمسی را به میلادی تبدیل کنید و از تابع DateDiff استفاده کنید. یک روش هم این هست که خودتان یک تابع بنویسید که تاریخ شمسی را یک سال جلوتر ببرد. مثل تابع زیر ولی باز می شه این تابع را بهینه تر کرد.
Create Function [dbo].[AddShamsiMonth](@Date nvarchar(10) ,@Count Int) Returns nvarchar(10) As
Begin
Declare @Month Tinyint = Cast(Substring(@Date, 6, 2) As Tinyint)
Declare @NewMonth Tinyint = Case (@Month + @Count) % 12
When 0 Then 12
Else ( @Month + @Count ) % 12
End
Declare @Year Int = Left(@Date, 4)
Declare @NewYear Int = @Year + Floor((@Month + @Count - 1) / 12)
Declare @Day Tinyint = Cast(Right(@Date, 2) As Tinyint)
Declare @NewDay Tinyint = @Day
If @Day = 31 And @NewMonth > 6
Begin
Set @NewMonth = @NewMonth +1
IF @NewMonth > 12
BEGIN
Set @NewMonth = 1
Set @NewYear = @NewYear +1
End
Set @NewDay = 1
End
Return Cast(@NewYear As nvarchar(4)) + '/' + Replicate('0',2 - Len(@NewMonth)) +
Cast(@NewMonth As nvarchar(2)) + '/' + Replicate('0',2 - Len(@NewDay)) +
Cast(@NewDay As nvarchar(2))
End
این تابع یک تاریخ شمسی و تعداد ماه را می گیرد و تاریخ جدید را برمی گرداند شما می توانید تاریخ عضویت و عدد 12 را وارد کنید و خروجی را با تاریخ امروز مقایسه کنید اگر مساوی یا کوچکتر بود که مدت عضویت به پایان رسیده
Iran58
یک شنبه 28 شهریور 1389, 15:48 عصر
فکر کنم نمی شه روی فیلد date&time، تاریخ شمسی را ذخیره کرد آیا مطمئن هستید که فیلد از نوع date&time
هست.
یک راه این هست که تاریخ شمسی را به میلادی تبدیل کنید و از تابع DateDiff استفاده کنید. یک روش هم این هست که خودتان یک تابع بنویسید که تاریخ شمسی را یک سال جلوتر ببرد. مثل تابع زیر ولی باز می شه این تابع را بهینه تر کرد.
Create Function [dbo].[AddShamsiMonth](@Date nvarchar(10) ,@Count Int) Returns nvarchar(10) As
Begin
Declare @Month Tinyint = Cast(Substring(@Date, 6, 2) As Tinyint)
Declare @NewMonth Tinyint = Case (@Month + @Count) % 12
When 0 Then 12
Else ( @Month + @Count ) % 12
End
Declare @Year Int = Left(@Date, 4)
Declare @NewYear Int = @Year + Floor((@Month + @Count - 1) / 12)
Declare @Day Tinyint = Cast(Right(@Date, 2) As Tinyint)
Declare @NewDay Tinyint = @Day
If @Day = 31 And @NewMonth > 6
Begin
Set @NewMonth = @NewMonth +1
IF @NewMonth > 12
BEGIN
Set @NewMonth = 1
Set @NewYear = @NewYear +1
End
Set @NewDay = 1
End
Return Cast(@NewYear As nvarchar(4)) + '/' + Replicate('0',2 - Len(@NewMonth)) +
Cast(@NewMonth As nvarchar(2)) + '/' + Replicate('0',2 - Len(@NewDay)) +
Cast(@NewDay As nvarchar(2))
End
این تابع یک تاریخ شمسی و تعداد ماه را می گیرد و تاریخ جدید را برمی گرداند شما می توانید تاریخ عضویت و عدد 12 را وارد کنید و خروجی را با تاریخ امروز مقایسه کنید اگر مساوی یا کوچکتر بود که مدت عضویت به پایان رسیده
سلام
من هم ميلادي را مي خواهم باتشكر
behrouzlo
یک شنبه 28 شهریور 1389, 17:15 عصر
برای میلادی می توان به شکل زیر با تابع DateAdd به جواب رسید:
DateAdd(Year,1,@MembershipDate)
اگر مقدار خروجی بزرگتر یا مساوی با getDate بود تاریخ عضویت به پایان رسیده است
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.