C# 在C中从SQL数据库读取日期时间值时没有毫秒值

C# 在C中从SQL数据库读取日期时间值时没有毫秒值,c#,sql-server,datetime,C#,Sql Server,Datetime,我在SQL server中存储了高精度的日期,例如 2009-09-15 19:43:43.910 但是,当我将该值转换为DateTime时,结果DateTime值的毫秒值为0: reader["Timestamp"] = 15/09/2009 19:43:43.000 让这些DateTime值的精度降低到毫秒对我来说非常重要-这样做的最佳方式是什么 更新:这是执行转换的代码: DateTime myDate = (DateTime)reader[Timestamp"]; SELECT语句

我在SQL server中存储了高精度的日期,例如

2009-09-15 19:43:43.910
但是,当我将该值转换为DateTime时,结果DateTime值的毫秒值为0:

reader["Timestamp"] = 15/09/2009 19:43:43.000
让这些DateTime值的精度降低到毫秒对我来说非常重要-这样做的最佳方式是什么

更新:这是执行转换的代码:

DateTime myDate = (DateTime)reader[Timestamp"];
SELECT语句没有什么特别之处,事实上它是一个SELECT*——没有花哨的类型转换或其他任何东西


SqlDataReader返回的DateTime对象似乎没有使用毫秒值填充。

可能会有所帮助。

这是因为DateTime的默认格式字符串不包括毫秒

如果使用自定义格式,将看到毫秒值

例如:

  public class Program
  {
    private static string connString = @"Data Source=(local);Initial Catalog=DBTest;Integrated Security=SSPI;";
    public static void Main(string[] args)
    {
      using (SqlConnection conn = new SqlConnection(connString))
      {
        conn.Open();

        using (SqlCommand cmd = new SqlCommand("SELECT * FROM MilliSeconds"))
        {
          cmd.Connection = conn;

          SqlDataReader reader = cmd.ExecuteReader();
          while(reader.Read())
          {
            DateTime dt = (DateTime)reader["TimeCollected"];
            int milliSeconds = dt.Millisecond;
            Console.WriteLine(dt.ToString("yyyy-MM-dd HH:mm:ss.fff"));
          }
        }
      }

      Console.ReadLine();
    }
  }
从具有以下值的数据库:

1   2009-09-22 18:11:12.057 
2   2009-09-22 18:11:28.587 
3   2009-09-22 18:11:29.820
上述代码的结果输出为:

2009-09-22 18:11:12.057 
2009-09-22 18:11:28.587 
2009-09-22 18:11:29.820

下面是我如何尝试解决此问题的:

在调试器中单步执行并查看reader[Timestamp]的类型和值。如果类型不是SqlDateTime,这会让我产生怀疑——然后我会查看查询,找出为什么该列返回另一个类型而不是DATETIME或DATETIME2,等等

如果该值是SqlDateTime,并且它确实包含毫秒,那么我会将转换视为问题的根源。为了验证这一点,我将尝试使用调试器或编写SqlDataReader.GetDateTime和SqlDataReader.GetSqlDateTime代码,以查看两者是否返回正确的结果。诚然,这似乎真的不太可能,因为问题的根源——角色扮演应该可以很好地工作

如果1中的值是SqlDateTime,但不包含毫秒,那么我将查看数据库中的上游问题——换句话说,您的查询返回的是没有毫秒的内容。在ManagementStudio中执行完全相同的查询时,是否会看到毫秒


我猜这是一个与查询相关的问题。但我很想找到我们的更多

我也遇到了同样的问题,读了几遍之后发现,当你像以前那样检索日期时

DateTime myDate = (DateTime)reader["Timestamp"];
SQLDataReader会删除毫秒。但是,如果使用SQLDataReader的GetDateTime方法,它将返回一个保留毫秒的DateTime对象:

reader.GetDateTime(reader.GetOrdinal("Timestamp"));

我也遇到了同样的问题,我通过将C DateTime持久化为一个用DateTime.Ticks填充的SQL bigint解决了这个问题。这将保留完整的日期时间精度。当然,可以使用DateTimelong ticks构造函数反序列化。

您是如何执行转换的?请显示您的代码。根据该值对您的重要性,您可能需要不同的存储机制。10^-3秒的部分是四舍五入的。嗯,我现在可以看到,但是最接近的003、005或007仍然比我在C DateTime中看到的最接近的精度高很多,即1.000如果你尝试reader[Timestamp],会发生什么。ToString?我打赌20美元,你的毫秒不会被插入数据库。这有点帮助,但是那篇文章解释了DateTime类型比SqlDateTime类型精度更高-这个精度在哪里丢失了?对不起,它不是Timestamp.ToString YYY-MM-dd HH:MM:ss.fff返回19:43:43.000-请注意,当数据库中的毫秒值为910时,它们都是0。我不同意你的看法。我已经添加了示例代码的结果输出。读取器[Timestamp]的类型是System.DateTime-尝试转换为SqlDateTime失败。查询是一个简单的SELECT*from…-这个在本例中是非常复杂的,但是我在SQLServerManagementStudio中执行了完全相同的查询,然后查看毫秒值?另外,另一种可能是如果你的。。。是一种连接,即来自不同表的两个coulmn具有相同的名称但具有不同的值。在查询中用一个列名称替换*很容易测试。结果证明,我的问题毕竟是查询的问题-我必须捕获探查器跟踪并执行精确的查询,毫秒值为空。