2017-03-02 1 views
2

enter image description here Je souhaite trouver le nombre total de jours entre deux valeurs DateTime. J'ai donc créé totaldays qui effectue la soustraction:Arrondir une valeur TimeSpan au premier entier

TimeSpan totaldays = enddatedata - startdatedata; 

Je veux arrondir le TimeSpan au premier nombre entier, par exemple 13 au lieu de 13: 00: 00: 00 que je veux ajouter la valeur 13 dans la base de données . Pour fins de test, je me sers d'une étiquette pour afficher le résultat:

lbltotaldays.Text = (totaldays.ToString()); 

Comment puis-je arrondir la valeur que le premier numéro?

protected void insertbutton_Click(object sender, EventArgs e) 
    { 

     int? recurrencedata = Convert.ToInt32(ddlRecurrence.Text); 
     if (recurrencedata == 1) 
     { 
      int moduledata = Convert.ToInt32(ddlModule.Text); 
      DateTime startdatedata = Convert.ToDateTime(txtstartdate.Text); 
      DateTime enddatedata = Convert.ToDateTime(txtenddate.Text); 
      int classtypedata = Convert.ToInt32(ddlClassType.Text); 
      int roomcodedata = Convert.ToInt32(ddlRoomCode.Text); 
      int starttimedata = Convert.ToInt32(ddlStartClassTime.Text); 
      int endtimedata = Convert.ToInt32(ddlEndClassTime.Text); 

      startdatedata = DateTime.Parse(txtstartdate.Text).Date; 
      enddatedata = DateTime.Parse(txtenddate.Text).Date; 
      TimeSpan totaldays = enddatedata - startdatedata; 

      string DefaultConnection = WebConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString; 
      SqlConnection myConnection = new SqlConnection(DefaultConnection); 

      myConnection.Open(); 

      string query = "INSERT INTO Class (ModuleId, ClassTypeId, ClassScheduleStartTimeId, ClassScheduleEndTimeId, RoomCodeId, StartTime, EndTime, RecurrenceId, TotalDayNumber) VALUES (@moduledata, @classtypedata, @starttimedata, @endtimedata, @roomcodedata, @startdatedata, @enddatedata, @recurrencedata, @totaldaynumberdata)"; 

      SqlCommand myCommand = new SqlCommand(query, myConnection); 
      myCommand.Parameters.AddWithValue("@moduledata", moduledata); 
      myCommand.Parameters.AddWithValue("@classtypedata", classtypedata); 
      myCommand.Parameters.AddWithValue("@startdatedata", startdatedata); 
      myCommand.Parameters.AddWithValue("@enddatedata", enddatedata); 
      myCommand.Parameters.AddWithValue("@starttimedata", starttimedata); 
      myCommand.Parameters.AddWithValue("@roomcodedata", roomcodedata); 
      myCommand.Parameters.AddWithValue("@endtimedata", endtimedata); 
      myCommand.Parameters.AddWithValue("@recurrencedata", recurrencedata); 
      myCommand.Parameters.AddWithValue("@totaldaynumberdata", totaldays); 
      myCommand.ExecuteNonQuery(); 
      myConnection.Close(); 

      SuccessPanel.Visible = true; 
      lbltotaldays.Text = (totaldays.ToString()); 
     } 
    } 
} 
+1

TimeSpan.TotalDays est une valeur double avec le timespan en tout et jours fractionnaires. Vous pouvez arrondir ceci à un entier en utilisant Math.Round. – Joe

+0

Merci pourriez-vous donner un exemple en contexte avec mon code? Merci beaucoup –

+0

Le problème que vous voyez n'a rien à voir avec ce que vous passez: le champ qui a un problème est de type DB 'time', et il survole parce que vous y mettez 14 jours ; Le temps DB peut durer au plus 23:59:59. – dasblinkenlight

Répondre

1

Si vous cherchez à obtenir le nombre de jours complets de TimeSpan, utilisez sa Days propriété:

lbltotaldays.Text = totaldays.Days.ToString(); 

Cela ne tient pas compte du nombre d'heures, donc, par exemple, 13 jours 22 heures et 5 minutes produiront 13.

Si vous souhaitez traiter 13½ jours comme 14, appelez Math.Round sur la propriété TotalDays:

lbltotaldays.Text = ((int)Math.Round(totaldays.TotalDays, MidpointRounding.AwayFromZero)).ToString(); 
+0

Merci. Je suis sûr que cela fonctionne lors de l'affichage dans l'étiquette, mais l'étiquette était juste pour tester quelle valeur il afficherait. Je veux réellement insérer la valeur par exemple 13 dans la colonne de la base de données 'TotalDayNumber' qui a mis à un int –

+0

@DavidCraven Passer le 'ToString' alors - c'est-à-dire aller avec' (int) Math.Round (totaldays.TotalDays) 'ou' (int) totaldays.Days', selon que vous avez besoin d'arrondir ou non. – dasblinkenlight

+0

Notez que la valeur par défaut pour Math.Round est d'utiliser l'arrondi du banquier, donc 12.5 est arrondi à 12. Je pense que vous avez oublié de spécifier la méthode d'arrondi, comme 'Math.Round (totaldays.TotalDays, MidpointRounding.AwayFromZero)'. Ou 'Math.Ceiling' pourrait être approprié. –