2017-09-05 20 views
1

私は勤務時間を数えるだけの時間差を計算するタスクを割り当てられています。C#で時間差を計算してmysqlに保存する

if (!txt_data2.Text.Contains("_") && !string.IsNullOrEmpty(txt_data2.Text) && txt_data2.Text != null && !txt_hora2.Text.Contains("_") && !string.IsNullOrEmpty(txt_hora2.Text) && txt_hora2.Text != null) 
      { 
       TimeSpan hi = TimeSpan.Parse(txt_horainicio.Text); 
       TimeSpan hf = TimeSpan.Parse(txt_hora2.Text); 

       if (hi.Hours < 9 || hf.Hours > 18) 
       { 
        MessageBox.Show("Horas Inválidas"); 
       } 

       else 
       { 
        if (MessageBox.Show("Inserir horas extraordinárias?", "Horas Extraordinárias", MessageBoxButtons.YesNo, MessageBoxIcon.Information) == DialogResult.Yes) 
        { 
         double extra; 
         TimeSpan horasextra; 

         Frm_Tempo frm1 = new Frm_Tempo(); 

         if (frm1.ShowDialog() == DialogResult.OK) 
         { 
          horasextra = TimeSpan.Parse(frm1.txt_horasextra.Text); 
          extra = horasextra.TotalHours; 

          DateTime data1 = Convert.ToDateTime(txt_datainicio.Text); 
          TimeSpan hora1 = TimeSpan.Parse(txt_horainicio.Text); 
          DateTime dataentrega1 = Convert.ToDateTime(txt_data2.Text); 
          TimeSpan horaentrega1 = TimeSpan.Parse(txt_hora2.Text); 

          data1 = data1.Add(hora1); 
          dataentrega1 = dataentrega1.Add(horaentrega1); 

          double horas1 = 0; 
          double minutos1 = 0; 

          for (var i = data1; i < dataentrega1; i = i.AddMinutes(1)) 
          { 
           if (i.DayOfWeek != DayOfWeek.Saturday && i.DayOfWeek != DayOfWeek.Sunday) 
           { 
            if (i.TimeOfDay.Hours >= 9 && i.TimeOfDay.Hours <= 18) 
            { 
             if (i.TimeOfDay.Hours >= 13 && i.TimeOfDay.Hours < 14) 
             { 

             } 

             else 
             { 
              minutos1++; 

              for (var x = data1; x < dataentrega1; x = x.AddHours(1)) 
              { 
               horas1 = (minutos1/60) + extra; 
              } 
             } 
            } 
           } 
          } 

          TimeSpan tempo1 = TimeSpan.FromHours(horas1); 

          MySqlCommand UPDATE20 = new MySqlCommand("UPDATE tbl_orcamentos SET tempo ='" + tempo1 + "'WHERE id ='" + txt_cod.Text + "'", ligar); 
          UPDATE20.ExecuteNonQuery(); 
         } 
        } 

        else 
        { 
         DateTime data = Convert.ToDateTime(txt_datainicio.Text); 
         TimeSpan hora = TimeSpan.Parse(txt_horainicio.Text); 
         DateTime dataentrega = Convert.ToDateTime(txt_data2.Text); 
         TimeSpan horaentrega = TimeSpan.Parse(txt_hora2.Text); 

         data = data.Add(hora); 
         dataentrega = dataentrega.Add(horaentrega); 

         float horas = 0; 
         float minutos = 0; 

         for (var i = data; i < dataentrega; i = i.AddMinutes(1)) 
         { 
          if (i.DayOfWeek != DayOfWeek.Saturday && i.DayOfWeek != DayOfWeek.Sunday) 
          { 
           if (i.TimeOfDay.Hours >= 9 && i.TimeOfDay.Hours < 18) 
           { 
            if (i.TimeOfDay.Hours >= 13 && i.TimeOfDay.Hours < 14) 
            { 

            } 

            else 
            { 
             minutos++; 

             for (var x = data; x < dataentrega; x = x.AddHours(1)) 
             { 
              horas = minutos/60; 
             } 
            } 
           } 
          } 
         } 

         TimeSpan tempo = TimeSpan.FromHours(horas);      

         MySqlCommand UPDATE21 = new MySqlCommand("UPDATE tbl_orcamentos SET tempo ='" + tempo + "'WHERE id ='" + txt_cod.Text + "'", ligar); 
         UPDATE21.ExecuteNonQuery(); 
        } 
       } 
      } 

私はC#とMySQLデータベースを使用しています:検索した後、私はこの(それはポルトガル語でちょっとだけど、私はそれが理解しやすいと思います)を取得することができました。

"48:00:00"の代わりに48hだったら "tempo"として有効ではない "2.00:00:00"に更新しようとしていますmysqlのフィールド。私はそれを解決する方法を本当に知らないし、今まで私は "horas"を日時にして、それを正しいフォーマットにフォーマットしようとしましたが、うまくいきませんでした。

私は本当に助けていただければ幸いです。理解しづらい場合は、ごめんなさい、尋ねてください、私はさらに説明しようとします。

EDIT:

タイムスパンに時間数を含んでいるフロート「horas」追加:

TimeSpan tempo = TimeSpan.FromHours(horas); 
+0

コードサンプルを減らして、 '48h'を' TimeSpan'に解析する関連する行を表示することができますか? – rae1

+0

時間列を23:59:59より大きい時間で更新することはできません。それ以外の場合は文字列型に変更する必要があります – LONG

+0

編集にコード行を入れます –

答えて

0

時間の差のための標準的なSQLデータ型は、「間隔」です。 MySQLは、「間隔」データ型をサポートしていません。

時刻と間隔が同じ表記を使用していますが、意味が異なるため、混乱する可能性があります。値「1:00」は、時刻(「時刻」または「タイムスタンプ」)の場合は1時を意味します。しかし、同じ値は、それが間隔であれば1時間を意味します。

また、「48:00:00」は有効な間隔(48時間)ですが、有効な時刻ではありません。

MySQLを使用している場合は、間隔を計算し、時間、分、秒の数を表す整数で表示し、表示する形式を指定します。たとえば、アプリケーションの要件に応じて、2時間を整数7200(秒)または整数120(分)として格納します。その整数を表示するために「2:00」と書式設定します。 C#のTimeSpan.FromMinutesTimeSpan.FromSecondsが役に立ちます。

間隔をサポートするオープンソースdbmsで遊びたい場合は、PostgreSQLを参照してください。

関連する問題