PDA

View Full Version : مشكل در استفاده و مقايسه ساعت (Time)



s_savabi
دوشنبه 31 خرداد 1389, 10:02 صبح
سلام
توي يك پروسيجر، ساعت فعلي رو ميگيرم و ميخام مقايسه اش كنم كه بين چند تا بازه زماني كه تعريف كردم هست يانه؟



Declare @Start_T datetime
Declare @End_T datetime
Declare @Current_Time datetime
Set @Start_T = 07:00PM
Set @end_T = 03:00AM
Set @Current_Time = Select Right(GetDate(),7)

if @Current_Time Between @Start_t and @End_t
Print ' OK '


ولي اين كار رو نميتونم پياده سازي كنم يعني خطا نميده ولي كار هم نميكنه!!!
لطفا راهنمايي كنيد

محمد سلیم آبادی
دوشنبه 31 خرداد 1389, 14:43 عصر
دوست من،
این قطعه کدی که قرار دادین مشکلات فراوانی دارد که هر کدام را مورد بررسی قرار خواهم داد.
1. زمانی که چند متغیر را می خواهین تعریف کنید نیازی نیست که هر کدام را به طور جداگانه با دستور DECLARE تعریف کنید. کافیه یک DECLARE بنویسید و با کاراکتر کاما هر تعداد متغیری که می خواهین را تعریف کنید.
یعنی اون قسمت کد شما که مربوط به این موضوع هست به این شکل در خواهد آمد:


Declare @Start_T datetime,
@End_T datetime,
@Current_Time datetime;


2. بایستی مقدار ساعتی را که به متغیر های شروع و پایان انتساب می دهین را داخل یک جفت تک کوتیشن قرار بدین یعنی :


Set @Start_T = '01:00 AM'
Set @end_T = '03:00 PM'

3. Select باید از این عبارت حذف شود:

Set @Current_Time = Select Right(GetDate(),7)

4. این را می دانید که AM قبل از ظهر و PM برای بعد از ظهر در نظر گرفته میشود. ولی در این مورد من علاقه دارم که از
24-hour clock استفاده کنم.
بوسیله ی تابع CONVERT و استایلی که برای آن می توان تعریف کرد مساله حل می شود.
(اگر واقعا می خواهید متوجه بشید که مشکل اساسی کدتان به چی مربوط است کافیه مقادیر دو متغیر زمان شروع و زمان پایان را print کنید)

در نهایت کد مطلوب شما به این شکل در خواهد آمد:
هم اکنون که دارم این پست را میزنم ساعت در حدود 3:06 دقیقه PM است. پس OK باید چاپ شود.


Declare @Start_T datetime,
@End_T datetime,
@Current_Time datetime;

Set @Start_T = '09:00 AM'
Set @end_T = '04:00 PM'

Set @Current_Time = GetDate()


if convert(varchar(50), @Current_Time, 114)
Between convert(varchar(50), @Start_T, 114)
and convert(varchar(50), @end_T, 114)
Print ' OK '

s_savabi
سه شنبه 01 تیر 1389, 10:21 صبح
Declare @Start_T datetime,
@End_T datetime,
@Current_Time datetime;

Set @Start_T = '07:00 PM'
Set @end_T = '04:00 AM'

Set @Current_Time = '10:30 PM'


if convert(varchar(50), @Current_Time, 114)
Between convert(varchar(50), @Start_T, 114)
and convert(varchar(50), @end_T, 114)
Print ' OK '


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

محمد سلیم آبادی
سه شنبه 01 تیر 1389, 12:01 عصر
وقتی از عملگر Between استفاده می کنید بایستی حتما مقدار شروع کوچکتر از مقدار پایان باشه.

وقتی می گین ساعت مثلا بین 11 شب تا 1 صبح باشه. میتونید ابتدا چک کنید که ساعت بین 11 شب تا 12 شب هست یا اینکه ساعت بین 00:00 تا 1 صبح هست یا نه. اگر یکی از این شرط ها درست بود یعنی اینکه ساعت مورد نظر بینی 11 شب تا 1 صبح بوده.

اینم کدش:


Declare @Start_T datetime,
@End_T datetime,
@Current_Time datetime;

Set @Start_T = '07:00 PM'
Set @end_T = '04:00 AM'

Set @Current_Time = '10:30 PM'

if convert(varchar(50), @Start_T, 114)
> convert(varchar(50), @end_T, 114)

if convert(varchar(50), @Current_Time, 114)
Between convert(varchar(50), @Start_T, 114)
and convert(varchar(50), cast('11:59:59 PM' as datetime),114)
Or convert(varchar(50), @Current_Time, 114)
Between convert(varchar(50), cast('00:00:01 AM' as datetime),114)
and convert(varchar(50), @End_T, 114)

Print ' OK '

s_savabi
سه شنبه 01 تیر 1389, 12:06 عصر
خيلي خيلي ممنونم دوست عزيز:تشویق:
موفق و پيروز باشيد