【问题标题】:Increment DateTime value based on total number of days根据总天数增加 DateTime 值
【发布时间】:2023-03-23 23:26:01
【问题描述】:

当用户添加课程时,他们会选择课程的开始日期和结束日期。我已经能够计算结束日期和开始日期之间的值。我能够创建一个 For 循环,为班级所在的每一天在班级表中插入一行。例如 01/03/17 - 05/03/17 运行 5 天,因此它在 Class 表中添加了 5 行。

目前,它在开始日期中添加的每一行作为 01/03/2017 00:00:00 和结束日期 05/03/2017 00:00:00。

对于每一行,我想将日期递增 1,直到到达结束日期

例如:

01/03/2017 00:00:00  
02/03/2017 00:00:00   
03/03/2017 00:00:00   
04/03/2017 00:00:00   
05/03/2017 00:00:00

下面是我的 For 循环代码:

  public class UpdateTimetable
  {
    internal void insert_days(int moduledata, int? recurrencedata, DateTime startdatedata, DateTime enddatedata, int classtypedata, int roomcodedata, int starttimedata, int endtimedata, string totalday)
    {
        int tdays = Convert.ToInt16(totalday);
        for (int i = 1; i <= tdays; i++)
        {
            string connectionString = WebConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString;

            SqlConnection myConnection = new SqlConnection(connectionString);

            myConnection.Open();

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

            //myCommand.Parameters.AddWithValue("@daydata", DayId);
            myCommand.Parameters.AddWithValue("@moduledata", moduledata);
            myCommand.Parameters.AddWithValue("@classtypedata", classtypedata);
            myCommand.Parameters.AddWithValue("@startdatedata", startdatedata);
            myCommand.Parameters.AddWithValue("@enddatedata", enddatedata);
            myCommand.Parameters.AddWithValue("@roomcodedata", roomcodedata);
            myCommand.Parameters.AddWithValue("@starttimedata", starttimedata);
            myCommand.Parameters.AddWithValue("@endtimedata", endtimedata);
            myCommand.Parameters.AddWithValue("@recurrencedata", recurrencedata);

            myCommand.ExecuteReader();
            myConnection.Close();
        }
    }

}

这是我计算开始日期和结束日期之间总天数的代码。

            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;

            // This is rounding the TimeSpan to the day value only
            string totalday = ((int)Math.Round(totaldays.TotalDays, MidpointRounding.AwayFromZero)).ToString();

public class UpdateTimetable
{
 internal void insert_days(int moduledata, int? recurrencedata, DateTime startdatedata, DateTime enddatedata, int classtypedata, int roomcodedata, int starttimedata, int endtimedata, string totalday)
    {
        int tdays = Convert.ToInt16(totalday);

        DateTime startDate = DateTime.Now.AddDays(tdays);
        DateTime endDate = enddatedata;

        List<string> Dates = new List<string>();

        for (int i = 1; i <= endDate.Subtract(startDate).Days; i++)
        {
            Dates.Add(startDate.AddDays(i).ToString());
            string connectionString = WebConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString;

            SqlConnection myConnection = new SqlConnection(connectionString);

            myConnection.Open();

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

            //myCommand.Parameters.AddWithValue("@daydata", DayId);
            myCommand.Parameters.AddWithValue("@moduledata", moduledata);
            myCommand.Parameters.AddWithValue("@classtypedata", classtypedata);
            myCommand.Parameters.AddWithValue("@startdatedata", startdatedata);
            myCommand.Parameters.AddWithValue("@enddatedata", enddatedata);
            myCommand.Parameters.AddWithValue("@roomcodedata", roomcodedata);
            myCommand.Parameters.AddWithValue("@starttimedata", starttimedata);
            myCommand.Parameters.AddWithValue("@endtimedata", endtimedata);
            myCommand.Parameters.AddWithValue("@recurrencedata", recurrencedata);

            myCommand.ExecuteReader();
            myConnection.Close();
        }
    }

}

【问题讨论】:

  • 您的具体问题/问题是什么?你在找DateTime.AddDays吗?
  • 我添加了一张图片,说明我希望如何在结束日期内每天保存新行
  • 图片太多

标签: c# sql-server date for-loop


【解决方案1】:

不需要循环,你可以像这样生成值:

rextester 演示:http://rextester.com/QDQKX23942

declare @fromdate date = '20170301'
declare @thrudate date = '20170307'

;with n as (select n from (values(0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) t(n))
, dates as (
  select top (datediff(day, @fromdate, @thrudate)+1) 
      [Date]=convert(datetime,dateadd(day, row_number() over (order by (select 1)) -1, @fromdate))
    from         n as deka
      cross join n as hecto      /* 100 days */
      cross join n as kilo     /* 2.73 years */
      --cross join n as [tenK]    /* 27.3 years */
   order by [Date]
)

select StartTime=dateadd(hour,9,d.date), EndTime=dateadd(hour,10,d.date)
from dates d

返回:

+---------------------+---------------------+
|      StartTime      |       EndTime       |
+---------------------+---------------------+
| 01.03.2017 09:00:00 | 01.03.2017 10:00:00 |
| 02.03.2017 09:00:00 | 02.03.2017 10:00:00 |
| 03.03.2017 09:00:00 | 03.03.2017 10:00:00 |
| 04.03.2017 09:00:00 | 04.03.2017 10:00:00 |
| 05.03.2017 09:00:00 | 05.03.2017 10:00:00 |
| 06.03.2017 09:00:00 | 06.03.2017 10:00:00 |
| 07.03.2017 09:00:00 | 07.03.2017 10:00:00 |
+---------------------+---------------------+

或者更好的是,使用日历表:

日历和数字表参考:


要将其与您现有的插入语句结合起来,您可以使用这样的查询,不需要循环。

;with n as (select n from (values(0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) t(n))
, dates as (
  select top (datediff(day, @startdatedata,@enddatedata)+1) 
      [Date]=convert(datetime,dateadd(day, row_number() over (order by (select 1)) -1, @startdatedata))
    from         n as deka
      cross join n as hecto 
      cross join n as kilo  
   order by [Date]
)

insert into Class (ModuleId , ClassTypeId , ClassScheduleStartTimeId 
  , ClassScheduleEndTimeId , RoomCodeId , StartTime , EndTime , RecurrenceId ) 
select 
   @moduledata
 , @classtypedata
 , @starttimedata
 , @endtimedata
 , @roomcodedata
 , StartTime= d.Date + s.StartTime
 , EndTime  = d.Date + e.EndTime
 , @recurrencedata
from dates d
  cross apply (
    select StartTime = convert(datetime,ClassTime)
    from ClassSchedule 
    where ClassScheduleId = @starttimedata
    ) as s
  cross apply (
    select EndTime = convert(datetime,ClassTime)
    from ClassSchedule 
    where ClassScheduleId = @endtimedata
    ) as e

在此示例中,@starttimedata@endtimedata 将是表示小时的整数。如果需要按分钟添加,可以切换到dateadd(minute...

还有其他方法可以将时间添加到日期,但这取决于您的参数是什么类型以及您发送的值是什么。

【讨论】:

  • 好的,非常感谢您的建议,但我不熟悉使用您的方法。我确实需要一个 for 循环来将数据添加到数据库中,因为它会提取用户在前端选择的所有值。
  • @dcraven 添加了一个示例来说明如何同时进行这两项操作。
  • @dcraven 是的,您为 int startimedataint endtimedata 发送的值是什么。例如是从午夜开始的几小时还是几分钟?
  • @dcraven 好的,所以 @starttimedata@endtimedataClassScheduleIds 吗?而ClassTimedatetime 数据类型还是time 数据类型?
【解决方案2】:

如果您的问题是如何从给定的一加 n 天数中获取新的日期对象,您可以这样做

DateTime dt = someOldDt.AddDays(n);

【讨论】:

  • 我添加了一张图片,说明我希望新行每天递增到结束日期。我基本上想更改插入到 for 循环中的每个新行的开始日期。相应的结束日期将与开始日期相同。
【解决方案3】:

最后我想我找到了你想要的。请看下面的代码:

        DateTime startDate = DateTime.Now.AddDays(-5); //5 days ago.
        DateTime endDate = DateTime.Now;

        List<string> Dates = new List<string>();

        for (int i = 0; i <= endDate.Subtract(startDate).Days; i++)
        {
            Dates.Add(startDate.AddDays(i).ToString()); //sample!
            //if enddatedata is the date that must icrease and startDate is the first Date:
            enddatedata = startDate.AddDays(i);

            // SQL insert HERE
        }

        //Dates:
        //2017-02-26 5:45:25 PM
        //2017-02-27 5:45:25 PM
        //2017-02-28 5:45:25 PM
        //2017-03-01 5:45:25 PM
        //2017-03-02 5:45:25 PM
        //2017-03-03 5:45:25 PM

【讨论】:

  • 感谢您的建议。但我想每天增加每一行。在这种情况下,您是否需要 24 小时?
  • 如何在我的代码中添加一天?我让它们相隔一小时,因为这是用户在前端选择的。我在我的代码中添加了计算总天值^
  • 添加一天开始日期:DateTime endDate = startDate.AddDays(1); 它管理一个月的最后一天,如果它有 28 天或 30 天或 31 天。
  • 好的,谢谢,我试过了,但是我附上了上面的错误消息,当我将 TimeSpan totaldays 更改为 int 时收到的错误消息
  • NO... totalDays 是一个整数。足够了:totalDay = totalDays.ToString(); 如果你想把它改成字符串。不再需要这个了:((int)Math.Round(totaldays.TotalDays, MidpointRounding.AwayFromZero))
猜你喜欢
  • 2021-05-07
  • 1970-01-01
  • 2017-01-13
  • 1970-01-01
  • 1970-01-01
  • 2014-11-17
  • 1970-01-01
  • 2023-01-03
  • 2016-06-27
相关资源
最近更新 更多