计算两个日期之间的日期

时间:2019-09-13 08:29:04

标签: c# sql asp.net

我有一个开始日期和一个结束日期。

Start Date: 14/06/2018
End Date: 14/06/2020

用户将填写他们两年内要进行的评论。

我已经计算出开始日期和结束日期的日期差(以周为单位)。

因此,在这种情况下,将是105周。

假设用户希望每10周进行一次审核。

因此,我将105周/他们想要进行的评论次数划分为10.5。

我想将一条记录插入数据库10次,并使日期平均分布在开始日期和结束日期之间。

我该怎么做?

更新编辑:

        double test;

        test = (double)Convert.ToInt32(hdnUIOID.Value) / (double)Convert.ToInt32(txtEvery.Text);

        string constr = ConfigurationManager.ConnectionStrings["EBSLIVE"].ConnectionString;
        SqlConnection con = new SqlConnection(constr);
        SqlCommand cmd = new SqlCommand();


        var startDate = new DateTime(2018, 6, 14);
        var endDate = new DateTime(2020, 6, 14);
        var howManyReviews = test;
        // Calculate how many days between revisions
        var days = (endDate - startDate).Days / (howManyReviews - 1);
        // Calculate dates of revisions
        var revisionDates = new List<DateTime>() { startDate };
        while ((startDate = startDate.AddDays(days)) < endDate)
            revisionDates.Add(startDate);


        for (int i = 0; i < test; i++)
        {
            try
            {
                string strStudentStatus = "INSERT INTO EF_REVIEWDATES(REVIEW_DATE) VALUES "+ string.Join(",", Convert.ToDateTime(revisionDates.Select(dt => "('" + dt.ToString("yyyy-MM-dd") + "')")));
                cmd.CommandText = strStudentStatus.ToString();
                cmd.Parameters.Clear();

                cmd.Connection = con;
                con.Open();
                cmd.ExecuteNonQuery();
            }

            catch (SqlException ex)
            {
                string errorMsg = "Error in Insert";
                errorMsg += ex.Message;
                throw new System.Exception(errorMsg);
            }
            finally
            {
                con.Close();

                Response.Redirect(Request.RawUrl);
            }
        }

4 个答案:

答案 0 :(得分:1)

尝试下面的代码(注释中的解释):

  var startDate = new DateTime(2018, 6, 14);
  var endDate = new DateTime(2020, 6, 14);
  var howManyReviews = 10;
  // Calculate how many days between revisions
  var days = (endDate - startDate).Days / (howManyReviews-1);
  // Calculate dates of revisions
  var revisionDates = new List<DateTime>() { startDate };
  while ((startDate = startDate.AddDays(days)) < endDate)
    revisionDates.Add(startDate);

要在insert语句中使用它,可以使用:

string strStudentStatus = "INSERT INTO REVIEWDATES(REVIEW_DATE) VALUES " 
  + string.Join(",", revisionDates.Select(dt => "('" + dt.ToString("yyyy-MM-dd") + "')"))

答案 1 :(得分:0)

我不确定这是否对您有用,但是我有类似的事情。因此,您需要做的是创建一个for循环,for((int i = 0; i

et_.time_in = new TimeSpan(ftime.Hour, ftime.Minute, ftime.Second);
                ftime = ftime.AddMinutes(increment);
                et_.time_out = new TimeSpan(ftime.Hour, ftime.Minute, ftime.Second);

答案 2 :(得分:0)

您可以在SQL中尝试类似的操作:

declare
@startdate date ='14/06/2018',
@enddate date = '14/06/2020',

@weekInterval int = 10,
@Datei date 

set @Datei = @startdate

while @Datei<@enddate and DATEDIFF(week,@Datei,@enddate)>@weekInterval
begin
set @Datei =   DATEADD(week,@weekInterval,@Datei)
print @Datei
end

答案 3 :(得分:0)

您可以使用c#进行编码或执行完整的SQL查询,使用SQL可以执行循环或同时检索所有数据。

此答案解决了完整的SQL方法,避免了循环,并获取了要插入的数据。

它会生成递归CTE以获取间隔中的天数。然后,将每一行划分为特定的天数,并检查模数以仅过滤与所需间隔匹配的那些天。

declare @startDate datetime = '20190101', @endDate datetime = '20190301', @amount int = 7

;with recursivecte as
(
    select @startDate as [day]
    union all select DATEADD(day,1, [day]) as [day] from recursivecte where [day] <= @endDate
)
select allDays.[day] from
(
    select [day], ROW_NUMBER() over(order by [day]) % @amount as modulus from recursivecte
) allDays where modulus = 1