从C#中的SQL数据库读取DateTime值时没有毫秒值

时间:2009-09-22 16:02:14

标签: c# sql-server datetime

我有一个存储在SQL服务器中的高精度日期,例如

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对象似乎没有填充Millisecond值

5 个答案:

答案 0 :(得分:16)

我遇到了同样的问题,经过一些阅读后发现,当你正在检索日期时

DateTime myDate = (DateTime)reader["Timestamp"];

SQLDataReader会丢弃毫秒。但是,如果您使用SQLDataReader的GetDateTime方法,它将返回一个保留毫秒的DateTime对象:

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

答案 1 :(得分:6)

答案 2 :(得分:5)

这是因为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

答案 3 :(得分:0)

我遇到了同样的问题,我通过将C#DateTime作为填充 DateTime.Ticks 的SQL bigint 来解决它。这样可以保留完整的DateTime精度。当然可以使用 DateTime(长标记)构造函数进行反序列化。

答案 4 :(得分:-1)

以下是我尝试解决此问题的方法:

  1. 在调试器中单步执行并查看reader [Timestamp“]的类型和值。如果类型不是SqlDateTime,那会让我产生怀疑 - 然后我会查看查询来弄清楚为什么该列返回另一种类型而不是DATETIME(或DATETIME2等)

  2. 如果该值是SqlDateTime并且它确实包含毫秒,那么我会将转换视为问题的根源。为了验证这一点,我尝试(在调试器或代码中)SqlDataReader.GetDateTime()和SqlDataReader.GetSqlDateTime()来查看是否返回正确的结果。事实上这似乎不太可能是问题的根源 - 铸造应该工作正常。

  3. 如果来自#1的值是SqlDateTime但不包含毫秒,那么我会查看数据库中的上游问题 - 换句话说,您的查询返回的内容没有毫秒。当你在Management Studio中执行完全相同的查询时,你看到毫秒?

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