2016-07-19 10 views
1

私は仕事のためのアプリケーションをやっていて、私はちょうどbrickwallに遭遇しました。時間が深夜を過ぎるとDateTimeの範囲の問題

私たちは3シフト、06:00-13:36,13:36-23:00および23:00-06:00を持っています。 私は2つのラベル、1次のコードを使用してシフト開始時間と他のシフト終了時刻を表示する必要があります。

Dim StartTimeN As Date = DateTime.Now.AddDays(-1).ToShortDateString & " 23:01" 
    Dim EndTimeN As Date = DateTime.Now.ToShortDateString & " 06:00" 
    Dim StartTimeF As Date = DateTime.Now.ToShortDateString & " 06:01" 
    Dim EndTimeF As Date = DateTime.Now.ToShortDateString & " 13:36" 
    Dim StartTimeE As Date = DateTime.Now.ToShortDateString & " 13:37" 
    Dim EndTimeE As Date = DateTime.Now.ToShortDateString & " 23:00" 
    Dim CurrentTime As Date = DateTime.Now 


    If (CurrentTime.Ticks >= StartTimeN.Ticks And CurrentTime.Ticks <= EndTimeN.Ticks) Then 
     Label1.Text = "23:00" 
     Label2.Text = "06:00" 
    ElseIf (CurrentTime.Ticks >= StartTimeF.Ticks And CurrentTime.Ticks <= EndTimeF.Ticks) Then 
     Label1.Text = "06:00" 
     Label2.Text = "13:36" 
    ElseIf (CurrentTime.Ticks >= StartTimeE.Ticks And CurrentTime.Ticks <= EndTimeE.Ticks) Then 
     Label1.Text = "13:36" 
     Label2.Text = "23:00" 
    End If 

コードがナイトシフトを除いて、正常に動作します。私はSQLからdatacollectionを混乱させるので、23-00の間に追加日(-1)を持つことはできません。 私はshiftours(例えば、06:00-13:36など)の間にSQLデータを収集するグラフを持っています。 AddDays(-1)は前日のデータを収集するので、23:00から23:59までの時間に問題が発生します。 SUMのクエリは、私が23と00の間の時間を解決するかどうかはわかりませんDateTime.Now.ToShortDateString &「label1data(shiftstart)」とDateTime.Now

間使用しています選択し、私はIF、単一のステートメントを作成する必要がありますかSQL特定のSQL関数を使用して、23:00-00:00と00:00-06:00の結果を一緒に追加するか、これを行う簡単な方法がありますか?

私は初心者ですが、答えが簡単なのは残念ですが、この問題はアプリケーションをあきらめてしまったため、正常に動作しませんでした。

また、shiftthoursに基づく他の関数は、shiftstartとDateTime.Nowの間のTimeSpanを計算して、これまでにシフトを通過した時間を取得します。最大キャパシティで稼働した場合に生産された製品の数を表示するには、maxproducts/hourをそれに掛けます。アプリケーション全体は、シフト中にオペレータの生産に関する情報を表示したときに構築されます。

ありがとうございました。

+0

をあなたは申し訳ありません。オプションStrict' – Plutonix

+0

イム 'をオンにする必要がありますが、私はその1つの上に読む必要があります。それに精通していない:)ヒントのおかげで! – enial

答えて

0

あなたの問題は、夜勤は2日間にわたって落ちるということですので、あなたができます同じようにチェックしないでください。

ここにはあなたのための解決策があります。それは複雑に見えるかもしれませんが、構造が改善され、維持しやすくなります。私はあなたがシフトのリストからのシフトを見つけるために、そして、日付部分

''' <summary> 
''' A simple class to hold a shift start and end times 
''' </summary> 
Public Class Shift 
    Public Property StartTime As TimeSpan 
    Public Property EndTime As TimeSpan 
    Public ReadOnly Property IsnightShift As Boolean 
     Get 
      Return EndTime < StartTime 
     End Get 
    End Property 
    Public Sub New(startTime As TimeSpan, endTime As TimeSpan) 
     Me.StartTime = startTime 
     Me.EndTime = endTime 
    End Sub 
End Class 

についての機能を心配する必要はありませんので、これは、より良い、このソリューションに向いていると思うように私は、日付ではなく、タイムスパンを使用しています

''' <summary> 
''' Finds the shift for a given time 
''' </summary> 
''' <param name="shifts"></param> 
''' <param name="timeNow"></param> 
''' <returns></returns> 
Public Function FindShiftStartAndEndTimes(shifts As List(Of Shift), timeNow As TimeSpan) As Shift 
    Dim endOfDayTime As New TimeSpan(24, 0, 0) 
    Dim startOfDay As New TimeSpan(0, 0, 0) 

    For Each shift In shifts 
     'nigh shift is a special case so check we are after the start time and before midnight OR after midnight on the next day and before the end of shift 
     If shift.IsnightShift Then 
      If (timeNow >= shift.StartTime AndAlso timeNow < endOfDayTime) OrElse 
       (timeNow >= startOfDay AndAlso timeNow < shift.EndTime) Then 
       Return shift 
      End If 
     Else 
      If timeNow >= shift.StartTime AndAlso timeNow < shift.EndTime Then 
       Return shift 
      End If 
     End If 
    Next 
    Throw New Exception("Could not find a shift for that time") 
End Function 

次に、あなたはこのように、現在のシフトを見つけることができます。

Private Sub Button8_Click(sender As Object, e As EventArgs) Handles Button8.Click 
    'create a list of shifts 
    Dim shifts As New List(Of Shift) 
    'add your shifts to the list 
    shifts.Add(New Shift(New TimeSpan(6, 0, 0), New TimeSpan(13, 36, 0))) 
    shifts.Add(New Shift(New TimeSpan(13, 36, 0), New TimeSpan(23, 0, 0))) 
    shifts.Add(New Shift(New TimeSpan(23, 0, 0), New TimeSpan(6, 0, 0))) 

    'find the current shift 
    Dim shift = FindShiftStartAndEndTimes(shifts, New TimeSpan(DateTime.Now.Hour, DateTime.Now.Minute, DateTime.Now.Second)) 
    MessageBox.Show("Current Shift is " & shift.StartTime.ToString & "-" & shift.EndTime.ToString) 
End Sub 
+0

これは素晴らしいですが、コードを少し変更して、現在のシフト・スタートを印刷して、label1&2を表示するボタンをクリックしなくても自動的に終了するようにしました。問題はまだSQLですが、収集方法23:00〜06:00のデータ私は前のコメントに記載されているようにIf文だけを行うべきであると仮定していますか?時間が23かどうかによって異なるquerysかどうか? – enial

+0

VB.NETとSQLの2つの質問があると思いますので、新しい質問を投稿して使用しているSQLを投稿する方が良いでしょう –

+0

私はこの解決策を実装してくれてありがとうございます。私はこの "高度な"コーディングを以前に使ったことがないので、私はそれをもっと理解しようとしています。 20時から06時(月曜の朝)の日曜日にシフトを追加する必要があるとします。私はどのように前進しますか?現在の日が日曜日であれば、私はちょっと遊んで、シフトリストに新しいシフトを追加しました(Shift(New Shift)(New TimeSpan(20、0、0)、New TimeSpan(6、0、0)))。 – enial

0

うん、あなたはそれがあるときに応じて、使用することを何倍かを決定するための条件を使用する必要があります:

Dim StartTimeN As Date 
Dim EndTimeN As Date 

If (DateTime.Now.Hour = 23) Then 
    StartTimeN = DateTime.Now.ToShortDateString & " 23:01" 
    EndTimeN = DateTime.Now.AddDays(1).ToShortDateString & " 06:00" 
Else 
    StartTimeN = DateTime.Now.AddDays(-1).ToShortDateString & " 23:01" 
    EndTimeN = DateTime.Now.ToShortDateString & " 06:00" 
End 
+0

だから基本的に、私はSQLクエリとTimespan関数と同様に行う必要がありますか?例えば。時間= 23の場合、例のようにdatetime.now設定と同じ "sqlquery"ですか? – enial

+0

ええ、あなたはすべきです。 – VortixDev

+0

私は家に帰るとすぐにこれを試してみることができ、それを使って遊ぶことができます。その間、助けてくれてありがとう! – enial

関連する問題