2012-01-01 20 views
0

私は自分のアプリケーションにシフトがあります。私はユーザーが定義されたログにタイムスパンでログインできる時間を制限したい。ユーザーログインの時間制限

AMからPMへのシフト1は正常ですが、PMからAMへのチェックで問題が発生しています。これは、第2シフトが午後5時に開始し、翌日の午前10時に終了するためです。お使いの値が格納されていない場合は

DECLARE 
    @timenow TIME 

-- Get the current time 
SELECT @timenow = CONVERT(TIME, GETDATE()) 

SELECT * 
    FROM temp 
     -- This clause handles the case where the shifts don't go past midnight 
WHERE ((endtime > starttime) AND (@timenow BETWEEN starttime AND endtime)) 

     -- This clause handles the case where the shifts do go past midnight 
    OR ((endtime < starttime) AND (@timenow >= starttime OR @timenow <= endtime)) 

ユーザテーブル構造は、そのSTARTTIMEと終了時刻を想定し

shiftid, starttime, endtime 
1,  6:00:00 AM, 11:30:00 PM 
2,  5:00:00 PM, 10:00:00 AM 
+0

それはどんな種類の問題を作りますか?あなたのタイムシフトをどこで手に入れますか? SQLで直接? –

+2

現在使用しているコードを提供できますか?問題のある箇所を挙げることはできますか? – Origin

+0

デスクトップアプリケーションでこれが必要です。コードはここにあります tNow =フォーマット(現在、 "hh:mm tt") ''現在の時刻 stTime =フォーマット(ds.Tables( "shiftdetails"))行(0).Item ( "starttime")、 "hh:mm tt") 'テーブルから時刻を取得 edTime =フォーマット(ds.Tables( "shiftdetails"))行(0).Item( "endtime")、 "hh:mm tt ")"テーブルから時刻を取得する もしtNow> stTimeとtNow nbhatti2001

答えて

1

では、次を使用することができ、あなたのテーブルの時間値であり、ありますデータ型がTimeの場合、次のように変換できます。

CONVERT(TIME, starttime) 
あなたのコードでこれを行うには

更新

、あなたが次の行に変更する必要があります:SQLのロジックを一致させるために

If tNow > stTime And tNow < edTime Then 

を:

If tNow >= stTime OrElse tNow <= edTime Then 

これが作りますコード:

Dim tNow As String 
    Dim stTime As String 
    Dim edTime As String 

    tNow = Format(Date.Now, "hh:mm tt") 

    stTime = Format(ds.Tables("shiftdetails").Rows(0).Item("starttime"), "hh:mm tt") 
    edTime = Format(ds.Tables("shiftdetails").Rows(0).Item("endtime"), "hh:mm tt") 
    If stTime < edTime Then 
     If tNow >= stTime OrElse tNow <= edTime Then 
      bShift = True 
     End If 
    Else 
     If tNow >= stTime And tNow <= edTime Then 
      bShift = True 
     End If 
    End If 
+0

私はvb.netでこのコードを変換しましたが動作しませんでした。真夜中がタイムウインドウを越えると、スタート時間はそれほど長くなりません。開始時間は5.00 PMと言いましょう。そして、真夜中の場合には、時間の経過とともに1.amになります。現在の午前1時は5.00pm以下ですので、うまく動作しません。 – nbhatti2001

+0

@ nbhatti2001:テストして、これが動作することを確認したので、問題はVB変換であると思われます。過去の深夜シフトのロジックは、2番目のwhere句に含まれています。終了時刻(午前1時)が開始時刻(午後5時)よりも小さい場合、シフトは深夜を過ぎます。それで、現在の時刻(11pm)> =開始時刻(5pm)(真)または現在の時刻(午後11pm)<=終了時刻(午前1時)(偽)であるかどうかをチェックし、シフトが選択されます。このロジックは24時間のクロックでのみ比較する時間に依存することに注意してください。これはVBでもっと複雑になります。 –

+0

質問を編集して問題のあるコードを含めると、問題が発生している場所を見てみることができます。わかりやすいはずです。 –

0
select .... where timeWork >= TimeStart and timeWork < TimeEnd 
       and timeStart < timeEnd 
      or timeWork <= TimeStart and timeWork > TimeEnd 
       and timeStart < timeEnd 
関連する問題