【问题标题】:DateTime from SQL when read in C# gets reduced by 1 sec在 C# 中读取时来自 SQL 的 DateTime 减少了 1 秒
【发布时间】:2014-02-19 08:52:30
【问题描述】:

这是我的 c# 代码的一部分

try
{
    Database db = DatabaseFactory.CreateDatabase();

    string sqlCommand = Constants.GET_UPDATE_STATUS; ;
    DbCommand dbCommandWrapper = db.GetStoredProcCommand(sqlCommand);

    db.AddParameter(
        dbCommandWrapper,
        "@p_CurrentUpdatedUTCTime",
        DbType.DateTime2,
        ParameterDirection.InputOutput,
        null,
        DataRowVersion.Current,
        _myDateTime);

    db.AddOutParameter(dbCommandWrapper, "@p_UpdateStatus", DbType.Int16, 10);
    db.ExecuteNonQuery(dbCommandWrapper);
    status = 
      Convert.ToInt16(db.GetParameterValue(dbCommandWrapper, "@p_UpdateStatus"));
    currentUpdatedUTC = 
      db.GetParameterValue(dbCommandWrapper, "@p_CurrentUpdatedUTCTime").ToString();
}
catch (Exception exp)
{
    errorMessage = exp.Message;
    throw new DataAccessException(exp.Message, "UpdateStatusDAL", "GetUpdateStatus", exp);
}

在上面的代码中,currentUpdatedUTC 是我从 SQL 中读取的日期时间。 它工作正常,但从 SQL 读取的时间有 1 秒的差异。 例如,如果我执行它输出的 SQL 过程

2014-01-28T06:49:29 但是当我从 C# 中读取它时,我得到了 2014-01-28T06:49:28 这里是SQL存储过程参数

@p_UpdateStatus SMALLINT OUTPUT, @p_CurrentUpdatedUTCTime DATETIME OUTPUT

【问题讨论】:

  • 是否存储了毫秒?他们可能正在四舍五入。
  • 就算是,也应该传入c# part rite?
  • 取决于精度。看这篇文章的解释:milesquaretech.com/Blog/post/2011/09/12/…
  • SQL 的语法是这样的,当你遇到一个名字时,名字的形式或它所在的位置会立即告诉你什么类型的对象被命名。因此,真的没有理由使用前缀、后缀或其他任何东西来区分 SQL 中的对象类型。 (名称与视图是一个明显的例外,但您应该尽可能将视图与表一视同仁)

标签: c# sql sql-server datetime


【解决方案1】:

您将参数定义为DbType.DateTime2,但在存储过程中您使用的是DATETIME,它的精度较低。可能会发生舍入。

尝试在您的存储过程和基础 SQL 表中使用 DATETIME2

另外,我认为您并没有告诉我们全部情况,因为 SQL Management Studio 或默认的 .ToString() 输出都没有使用 ISO 格式(结果中带有 T)。也许您可以编辑您的问题以显示真实的输出。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-30
    • 2018-10-30
    • 1970-01-01
    • 2010-11-30
    • 1970-01-01
    • 1970-01-01
    • 2022-11-02
    • 2010-10-09
    相关资源
    最近更新 更多