PDA

View Full Version : زمان سپری شده از ارسال پست



b.paseban
شنبه 11 دی 1389, 16:02 عصر
سلام دوستان.
من میخوام زمان سپری شده از ارسال پست کاربر رو نمایش بدم.
زمان درج رو دارم و زمان حال هم دارم.
فقط نمیدونم واسه دستور SELECT چطوری این دومقدار رو از هم کم کنم و مقدار رو بصورت انلاین نمایش بدم.
آیا این مقدار توی دیتا بیس دوباره درج میشه یا نه؟چون مرتب این زمان تغییر می کنه.
یا راه حل مناسب دیگه ای هم وجود داره.
برای اینکه منظور خودم رو بهتر رسونده باشم میتونید به سایت asp.net مراجعه کنید که توی قسمت فروم اونجا همین سیستم وجود داره.
با تشکر از همه دوستان برنامه نویس.

Reza_Yarahmadi
شنبه 11 دی 1389, 16:23 عصر
با دستور DATEDIFF ميتونيد اختلاف زمان ثبت با زمان جاري رو بدست بياريد.

SELECT DATEDIFF(Minute, DateField, GetDate()) AS Minutes From TableNameدر دستور بالااختلاف بر حسب دقيقه محاسبه ميشه.

b.paseban
شنبه 11 دی 1389, 17:06 عصر
با تشکر از شما دوست عزیز.
من از این کد برای بدست آوردن اختلاف زمان استفاده میکنم:


DateTime start = new DateTime(2009, 6, 14, 16, 34, 25);
DateTime end =DateTime.Now;
TimeSpan difference = end - start;

TimeSpan difference = end - start; //create TimeSpan object
Console.WriteLine("Difference in days: " + difference.Days);


با استفاده از این کد من میتونم از ثانیه و دقیقه و ... اطلاع پیدا کنم .
چطوری من باید زمان ثبت پست رو بیرون بکشم و توی اون قسمت start قرار بدم و بعدش نمایش بدم.
تشکر.

b.paseban
شنبه 11 دی 1389, 17:36 عصر
توی کد شما چطوری باید فیلدهای دیگر دیتا بیس رو select کرد؟
توی دستور شما فقط 3 تا رگومان قبول میکنه.

b.paseban
شنبه 11 دی 1389, 18:12 عصر
آرگومانهای مورد استفاده در کد اول:
http://msdn.microsoft.com/en-us/library/ms189794.aspx

کد select رو پیدا کردم.حالا اگه بخوام یه دستور شرطی واسه این کد بزارم چطوری باید اینکار رو انجام بدم.
مثلا اگه نتیجه DATEDIFF بزرگتر از 60 بود جوابو به دقیقه بگه . مثلا اگه 76 ثانیه از زمان بین ارسال تا الان سپری شده باشه مقدار 1دقیقه و 16 ثانیه رو برگردونه.

بازم تشکر از دوستان.

b.paseban
شنبه 11 دی 1389, 19:27 عصر
کجای این دستور مشکل داره؟
من میخوام مقدار DATEDIFF رو بدست بیارم و بعدش واسش یه شرط بزارم.
ولی گویا شرط اجرا نمیشه.


@DATEDIFF INT=0
as
SELECT DATEDIFF(Minute, date, GETDATE()) AS Minutes From tblajax
If @DATEDIFF > 60
BEGIN
SELECT Id, name, family, age,
(SELECT DATEDIFF(Minute, date, GETDATE()) AS Minutes)
AS Id FROM tblajax
END
ELSE
BEGIN
SELECT Id, name, family, age,
(SELECT DATEDIFF(Second, date, GETDATE()) AS Minutes)
AS Id FROM tblajax
END

Reza_Yarahmadi
شنبه 11 دی 1389, 20:59 عصر
برای اینکه به ازا هر رکورد این تفاضل محاسبه بشه بهتر اینه که ابتدا تابعی بصورت زیر بنویسید

CREATE FUNCTION GetDiff
(
@dt DateTime,
@Now datetime
)
RETURNS varchar(max)
AS
BEGIN
Declare @Str varchar(max),
@Temp datetime,
@Year int,
@Month int,
@Day int,
@Hour int,
@Minute int,
@Second int
Set @Str = ''
Set @Year = DATEDIFF(Year, @dt, @Now) - 1
Set @Temp = DateAdd(Year, @Year, @dt)
Set @Month = DATEDIFF(Month, @Temp, @Now) - 1
Set @Temp = DateAdd(Month, @Month, @Temp)
Set @Day = DATEDIFF(Day, @Temp, @Now) - 1
Set @Temp = DateAdd(Day, @Day, @Temp)

Set @Hour = DATEDIFF(Hour, @Temp, @Now)
Set @Temp = DateAdd(Hour, @Hour, @Temp)
Set @Minute = DATEDIFF(Minute, @Temp, @Now)
Set @Temp = DateAdd(Minute, @Minute, @Temp)
Set @Second = DATEDIFF(Second, @Temp, @Now)
Set @Temp = DateAdd(Second, @Second, @Temp)
if(@Second > 59)
Begin
Set @Minute = @Minute + 1
Set @Second = @Second % 60
End
if(@Minute > 59)
Begin
Set @Hour = @Hour + 1
Set @Minute = @Minute % 60
End
if(@Hour > 23)
Begin
Set @Day = @Day + 1
Set @Hour = @Hour % 24
End
if(@Month IN (0,2,4,6,7,9,11) AND (@Day > 30))
Begin
Set @Month = @Month + 1
Set @Day = @Day % 31
End
else if(@Month IN (3,5,8,10) AND (@Day > 29))
Begin
Set @Month = @Month + 1
Set @Day = @Day % 30
End
else if (@Month = 1 AND @Day > 27)
Begin
Set @Month = @Month + 1
Set @Day = @Day % 28
End
if(@Month > 11)
Begin
Set @Year = @Year + 1
Set @Month = @Month % 12
End
Set @Str = @Str + Case When @Year > 0
Then Cast(@Year as varchar) + ' Year ' Else '' End
Set @Str = @Str + Case When @Month > 0 OR @Str <> ''
Then Cast(@Month as varchar) + ' Month ' Else '' End
Set @Str = @Str + Case When @Day > 0 OR @Str <> ''
Then Cast(@Day as varchar) + ' Day ' Else '' End
Set @Str = @Str + Case When @Hour > 0 OR @Str <> ''
Then Cast(@Hour as varchar) + ' Hour ' Else '' End
Set @Str = @Str + Case When @Minute > 0 OR @Str <> ''
Then Cast(@Minute as varchar) + ' Minute ' Else '' End
Set @Str = @Str + Case When @Second > 0 OR @Str <> ''
Then Cast(@Second as varchar) + ' Second ' Else '' End

Return @Str
END
بعد توی دستور Select بصورت زیر عمل کنید

Select dbo.GetDiff(date, GetDate()) as DateDiff From tblajax

b.paseban
یک شنبه 12 دی 1389, 11:25 صبح
با تشکر از شما دوست عزیز.
من با توابع sql آشنایی ندارم.میشه بگین من توی vs توی قسمت اضافه کردن یک تابع درون بانک از کدام گزینه باید استفاده کنم.
منظورم اینه که از inline function یا Table valued یا Scalar ؟
اگر امکانش هست یک مقدار در مورد کد خودتون توضیح بدین ممنون میشم.

Reza_Yarahmadi
یک شنبه 12 دی 1389, 12:06 عصر
توی vs توی قسمت اضافه کردن یک تابع درون بانک از کدام گزینه باید استفاده کنم.
منظورم اینه که از inline function یا Table valued یا Scalar ؟

تقريبا همشون معلومه چه نوع هستند
Scalar براي توابعي كه يك مقدار برميگردونه
Table valued براي خروجيهايي كه بصورت يك جدول باشه (فرضا يك Select) براي اطلاعات بيشتر ميتونيد به Book Online مراجعه كنيد توي اونجا هم كامل توضيح داده هم مثالهاي متنوعي داره.

اگر امکانش هست یک مقدار در مورد کد خودتون توضیح بدین ممنون میشم.
كار خاصي نميكنه ابتدا اختلاف سال رو بدست مياره بعد به اندازه همين اختلاف به تاريخ سورس اضافه ميكنه ، براي ماه ، روز ، ساعت ، دقيقه و ثانيه هم اين 2 كار رو به ترتيب انجام ميده.
مقدار روز در مرحله قبل بين 0 تا 60 ميشه براي همين چك ميكنه اگر توي هركدوم از ماههاي 31 روزه بوديم و مقدار روز بيشتر از 30 بود يك واحد به ماه اضافه كنه و مقدار روز رو برابر با باقيمانده بر 31 كنه (براي ماههاي 30 و 28 روزه هم همين كار رو ميكنه). براي ماه هم همين روال تكرار ميشه و در نهايت بصورت يك رشته به هم متصل ميشه و به خروجي ارسال ميشه.
شايد حجم كد يه ذره زياد به نظر بياد ولي هم منطق و هم دستوراتش ساده اند.