2017-09-05 18 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數據庫。

它似乎工作,但當結果是48h,而不是「48:00:00」,它試圖將其更新爲「2.00:00:00」,這是無效的「節奏」,這是一個時間在mysql中的字段。我真的不知道如何解決這個問題,到目前爲止,我已經嘗試將「horas」設置爲日期時間,然後將其格式化爲正確的格式,但不起作用。

我非常感謝任何幫助,如果難以理解,我很抱歉,只是問一問,我會盡力解釋。

編輯:

添加浮動「horas」,其中包含的小時數到時間跨度:

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

你可以減少代碼示例_only_顯示相關的行你分析'48h'到'TimeSpan'嗎? – rae1

+0

你不能更新時間列的時間大於23:59:59,否則你需要將其更改爲字符串類型 – LONG

+0

我把代碼行放在編輯 –

回答

0

在時間差的標準的SQL數據類型是「間隔」。 MySQL不支持「間隔」數據類型。

它可能會令人困惑,因爲一天中的時間和間隔使用相同的符號,但具有不同的含義。值'1:00'表示如果是一天的時間(「時間」或「時間戳」),則爲1點。但是如果是間隔,相同的值意味着一個小時。

此外,「48:00:00」是一個有效的間隔(48小時),但它不是一天中的有效時間。

如果您使用的是MySQL,請將間隔計算並存儲爲代表小時,分鐘或秒數以及顯示格式的整數。例如,根據應用程序的要求,將整數7200(秒)或整數120(分鐘)存儲兩個小時。將該整數格式化爲「2:00」以供顯示。 C#的TimeSpan.FromMinutesTimeSpan.FromSeconds將有所幫助。

如果您想要使用支持間隔的開源dbms,請查看PostgreSQL。