ورود

View Full Version : سوال: پر ترافیک ترین روز و ساعت



saba106
پنج شنبه 11 شهریور 1389, 22:01 عصر
سلام
من برای محاسبه پر ترافیک ترین روز و ساعت جدول ترافیک رو ایجاد کردم. که تاریخ و زمان و آیدی کاربر زمانی که لاگین می کنه تو جدول ثبت میشه. حالا برای اینکه پر ترافیکترین ساعت و روز رو برگردونم چه کوئری ای باید ایجاد کنم؟
مرسی

morteza_lll
پنج شنبه 11 شهریور 1389, 23:02 عصر
سلام
من برای محاسبه پر ترافیک ترین روز و ساعت جدول ترافیک رو ایجاد کردم. که تاریخ و زمان و آیدی کاربر زمانی که لاگین می کنه تو جدول ثبت میشه. حالا برای اینکه پر ترافیکترین ساعت و روز رو برگردونم چه کوئری ای باید ایجاد کنم؟
مرسی


سلام دوست من
شما يك كوئري بايد داشته باشي به حالت Group By و در آن تعداد id هاي موجود در آن تاريخ ئ ساعت را بدست ميآوريد بزركترين تعداد id مشود همان بيشترين ترافيك

بهزادصادقی
پنج شنبه 11 شهریور 1389, 23:22 عصر
اولین نکته ای که به نظر من می رسه اینه که شما داری از دو تا ستون که نوعشان varchar می باشد برای ذخیره کردن تاریخ و ساعت استفاده می کنی؟ جرا؟ SQL Server یک نوع type دارد به اسم datetime که به شما توانایی ذخیره ساعت و تاریخ دقیق یک اتفاق را می دهد. یکی از مزاید استفاده از datetime این است که توانایی پردازش محاسبات مختلف مربوط به زمان یا تاریخ را به شما می دهد. علاوه بر datetime، در SQL Server 2008 دو نوع type جدید نیز وجود دارد به اسم date و time. یعنی، نوع datetime هم زمان را ذخیره می کند و هم تاریخ را. ولی نوع date فقط تاریخ را دخیره می کند و نوع time فقط زمان را.

به هر حال، اگر فرض را بر این بگذاریم که شما به جای این دو ستون، یک ستون از نوع datetime درست می کنی که اسمش LoginِDateTime می باشد و زمان و تاریخ login کردن user های شما را ذخیره می کند، آن وقت شما می توانید از این query استفاده نمائید.

من ابتدا یک جدول به اسم dbo.LoginTraffic درست می کنم (اگر اول وجود داره، اونو پاک می کنم و دوباره از اول می سازمش) تا بتونم چند نمونه سطر داده را برای آزمایش query خود در آن وارد کنم. برای ذخیره شناسه کاربری، از ستونی به اسم UserID استفاده می کنم، چون معمولا در همه جدول هایم یک ستون به اسم id و از نوع identity لحاظ می کنم که از آن به عنوان primary key آن جدول استفاده می نمایم. ستون دیگری هم به وجود آورده ام به اسم LoginDateTime که تاریخ و زمان login کاربر را ذخیره می نماید. با احتساب مسائل بالا، دستور select ای که در آخر کد آمده، تعداد login های انجام شده در هر ساعت هر روز را محاسبه کرده، و کل ساعت های login ها را به ترتیب تعداد login های انحام شده در آن ساعت را لیست می نماید.

شما می توانید این کد را همین طور که هست در SQL Server Management Studio اجرا کنی و نتیجه را ببینید.


if object_id( 'dbo.LoginTraffic' ) is not null begin
truncate table dbo.LoginTraffic;
drop table dbo.LoginTraffic;
end
go

create table dbo.LoginTraffic
(
id int identity(1,1) primary key,
UserID int not null,
LoginDateTime datetime default getdate()
)

insert dbo.LoginTraffic (UserID, LoginDateTime) values (1, '2010-09-01 09:00' );
insert dbo.LoginTraffic (UserID, LoginDateTime) values (2, '2010-09-02 09:59' );
insert dbo.LoginTraffic (UserID, LoginDateTime) values (1, '2010-09-02 10:01' );
insert dbo.LoginTraffic (UserID, LoginDateTime) values (4, '2010-09-02 10:02' );
insert dbo.LoginTraffic (UserID, LoginDateTime) values (5, '2010-09-02 10:03' );
insert dbo.LoginTraffic (UserID, LoginDateTime) values (1, '2010-09-02 11:00' );
insert dbo.LoginTraffic (UserID, LoginDateTime) values (5, '2010-09-02 11:04' );
insert dbo.LoginTraffic (UserID, LoginDateTime) values (4, '2010-09-02 13:06' );
insert dbo.LoginTraffic (UserID, LoginDateTime) values (9, '2010-09-02 15:45' );
insert dbo.LoginTraffic (UserID, LoginDateTime) values (3, '2010-09-03 10:00' );

select
datepart( year, t.LoginDateTime ) TheYear,
datepart( month, t.LoginDateTime ) TheMonth,
datepart( day, t.LoginDateTime ) TheDay,
datepart( hour, t.LoginDateTime ) TheHour,
count(1) TheCount
from
dbo.LoginTraffic t
group by
datepart( year, t.LoginDateTime ),
datepart( month, t.LoginDateTime ),
datepart( day, t.LoginDateTime ),
datepart( hour, t.LoginDateTime )
order by
TheCount desc;

saba106
جمعه 12 شهریور 1389, 16:53 عصر
مرسی از جوابتون
من باید از تاریخ شمسی استفاده کنم. ولی نوع datetime اونو قبول نمیکنه

بهنام بهمنی
جمعه 12 شهریور 1389, 17:27 عصر
می توانید از نوع DateTime استفاده کنید, اما در هنگام نوشتن و خواندن با استفاده از دو Function مقادیر را به میلادی تبدیل و برگردانید

saba106
شنبه 13 شهریور 1389, 00:01 صبح
select
datepart( year, t.LoginDateTime ) TheYear,
datepart( month, t.LoginDateTime ) TheMonth,
datepart( day, t.LoginDateTime ) TheDay,
datepart( hour, t.LoginDateTime ) TheHour,
count(1) TheCount
from
dbo.LoginTraffic t
group by
datepart( year, t.LoginDateTime ),
datepart( month, t.LoginDateTime ),
datepart( day, t.LoginDateTime ),
datepart( hour, t.LoginDateTime )
order by
TheCount desc;

برای pm یا am بودن ساعت تو datepart چی باید بنویسم؟

بهزادصادقی
شنبه 13 شهریور 1389, 00:22 صبح
اگر ساعت از 12 کمتر است یعنی AM می باشد.

اگر 12 یا بیشتر است، یعنی PM.

دقیقا می خواهی چه چیزی را چه طوری نمایش بدی؟

saba106
شنبه 13 شهریور 1389, 00:37 صبح
اگر ساعت از 12 کمتر است یعنی AM می باشد.

اگر 12 یا بیشتر است، یعنی PM.

دقیقا می خواهی چه چیزی را چه طوری نمایش بدی؟
دستوراتی که گفتین رو تو یه viw نوشتم تو visual studio تو برنامه این view اجرا میشه و ماکسیمم تعداد رو پیده میکنه و تاریخ و زمان اون رو به عنوان پرترافیک ترین روز و زمان تو یه لیبل نشون میده. میخوام زمان به صورت کامل نشون داده شه واسه همین به pm/am نیاز دارم

بهزادصادقی
شنبه 13 شهریور 1389, 01:03 صبح
دستوراتی که گفتین رو تو یه viw نوشتم تو visual studio تو برنامه این view اجرا میشه و ماکسیمم تعداد رو پیده میکنه و تاریخ و زمان اون رو به عنوان پرترافیک ترین روز و زمان تو یه لیبل نشون میده. میخوام زمان به صورت کامل نشون داده شه واسه همین به pm/am نیاز دارم

مرسی. این چطوره؟



select
x.TheYear,
x.TheMonth,
x.TheDay,
case when x.TheHour > 12 then x.TheHour - 12 else x.TheHour end AmPmHour,
case when x.TheHour > 12 then 'PM' else 'AM' end AmPm
from
(
select
datepart( year, t.LoginDateTime ) TheYear,
datepart( month, t.LoginDateTime ) TheMonth,
datepart( day, t.LoginDateTime ) TheDay,
datepart( hour, t.LoginDateTime ) TheHour,
count(1) TheCount
from
dbo.LoginTraffic t
group by
datepart( year, t.LoginDateTime ),
datepart( month, t.LoginDateTime ),
datepart( day, t.LoginDateTime ),
datepart( hour, t.LoginDateTime )
) x
order by
x.TheCount desc;