【问题标题】:Why Difference between dates is wrongly calculated?为什么错误计算日期之间的差异?
【发布时间】:2015-10-30 11:32:41
【问题描述】:

我正在尝试从另一个日期中减去一个日期来计算天数差异。它返回类似于735907 的差异。为什么 ?它应该返回 6,7 或 10 等。

场景:

我从通过 SP 从数据库获取的另一个日期中减去我在 TEXTCHANGED 事件中传递到文本框的日期。

alter PROCEDURE [dbo].[SelectBillSubmissionDateByBilliD]

    @pk_BillsInfo_BillID int,
    @BillSubmissionDate date output 


AS
BEGIN

          Set @BillSubmissionDate= (Select BillsInfo.BillSubmissionDate
          from BillsInfo
          Where BillsInfo.pk_BillsInfo_BillID= @pk_BillsInfo_BillID)


END

然后

Bills.ManageBillsInfo MngBillsInfo = new Bills.ManageBillsInfo();

    protected void ddlBills_SelectedIndexChanged(object sender, EventArgs e)
    {
        Int32 BillID= Convert.ToInt32(ddlBills.SelectedValue);
        MngBillsInfo.BillSubmissionDate = MngBillsInfo.SelectBillSubmissionDateByBillID(BillID);     
    }

    protected void txtBoxBillPassingDate_TextChanged(object sender, EventArgs e)
    {
        DateTime BillPassingDate = Convert.ToDateTime(txtBoxBillPassingDate.Text);
        lblDelay.Visible = true;
        lblDelay.Text = Convert.ToString( (BillPassingDate - MngBillsInfo.BillSubmissionDate).Days);
    }
}

注意:MngBillsInfo.BillSubmissionDate 属于日期时间,调试时返回 1/1/0001。为什么?

更新:

我正在调用的函数:

 public DateTime SelectBillSubmissionDateByBillID(int BillID)
        {

            SqlCommand SqlCom = new SqlCommand("SelectBillSubmissionDateByBilliD", DatabaseConnection.OpenConnection());
            SqlCom.CommandType = CommandType.StoredProcedure;
            SqlCom.Parameters.AddWithValue("@pk_BillsInfo_BillID", BillID);

            SqlParameter SqlParamBillSubmissionDate = new SqlParameter("@BillSubmissionDate", SqlDbType.Date);
            SqlCom.Parameters.Add(SqlParamBillSubmissionDate);
            SqlParamBillSubmissionDate.Direction = ParameterDirection.Output;

            SqlCom.ExecuteNonQuery();
            DatabaseConnection.CloseConnection();
            DateTime BillSubmissionDate = Convert.ToDateTime(SqlParamBillSubmissionDate.Value);

            return BillSubmissionDate;

        }

【问题讨论】:

  • 1/1/0001 是DateTime.MinValue。该属性未设置。在这种情况下,736,000 天听起来确实是正确的。大约 365 * 2015。
  • 看起来您的存储过程返回 null。由于DateTime 是值类型,不能为null,所以设置为DateTime.MinValue,即1/1/001
  • @krillgar 好的先生,那该怎么办?
  • @AndyKorneyev 好的,先生,那么该怎么做才能使它正确?
  • 检查您的存储过程,看看它是否真的返回任何信息。我不认为你想要一个SET 在那里。只要是SELECT。

标签: c# asp.net sql-server ado.net


【解决方案1】:

更改您的 sp 以返回变量

Alter PROCEDURE [dbo].[SelectBillSubmissionDateByBilliD]
    @pk_BillsInfo_BillID int,
    @BillSubmissionDate date output 
AS
BEGIN
      Set @BillSubmissionDate = BillsInfo.BillSubmissionDate
      from BillsInfo
      Where BillsInfo.pk_BillsInfo_BillID= @pk_BillsInfo_BillID
 END

我认为查询返回的值不止一个,而您之前编写它的方式从中挑选了任何一个。我已从您的语句中删除了 select,现在如果您的语句返回超过 1 个值,这应该会出错。

【讨论】:

  • 是的先生,我检查了,在调试时,SP 在第一个事件中正确返回该值并分配给 MngBillsInfo.BillSubmissionDate,但在第二个事件中,相同的 BillSubmissionDate 是 1/1/0001
  • 您的查询“从 BillsInfo 中选择 BillsInfo.BillSubmissionDate 其中 BillsInfo.pk_BillsInfo_BillID= @pk_BillsInfo_BillID”返回多行并且选择只是选择其中之一,并且它恰好为空,是否可能是这种情况?
  • 不,先生,只返回 1 条记录,'10/30/2015',请检查我更新的问题
  • 是的,但是当它在第一个事件中分配给 MngBillsInfo.BillSubmissionDate 时,它​​仍然是正确的,但在第二个事件中它显示 '1/1/0001'。
  • MngBillsInfo.BillSubmissionDate 仅在第一个事件中填充。它没有在第二个事件中计算。因此为空值。你也应该在第二个事件中计算它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多