Нет значения в миллисекундах при чтении значений DateTime из базы данных SQL в C # - PullRequest
10 голосов
/ 22 сентября 2009

У меня на сервере 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 * - никаких причудливых приведений или чего-то еще

Похоже, что объект DateTime, возвращаемый SqlDataReader, просто не заполняется значением миллисекунды

Ответы [ 5 ]

16 голосов
/ 21 мая 2012

У меня была такая же проблема, и после некоторого чтения выясняется, что когда вы извлекаете дату, как вы делали

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

SQLDataReader сбрасывает миллисекунды. Однако если вы используете метод GetDateTime объекта SQLDataReader, он возвращает объект DateTime, который сохраняет миллисекунды:

reader.GetDateTime(reader.GetOrdinal("Timestamp"));
6 голосов
/ 22 сентября 2009
5 голосов
/ 22 сентября 2009

Это потому, что строка формата по умолчанию для 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
0 голосов
/ 30 августа 2012

У меня была та же проблема, и я решил ее, сохранив C # DateTime в виде SQL bigint , заполненного DateTime.Ticks . Это сохраняет полную точность DateTime. И, конечно, может быть десериализован с помощью конструктора DateTime (длинные тики) .

0 голосов
/ 22 сентября 2009

Вот как я бы попытался решить эту проблему:

  1. пошагово пройдитесь в отладчике и посмотрите на тип и значение читателя [Timestamp "]. Если тип не SqlDateTime, это вызовет у меня подозрения - тогда я бы посмотрел на запрос, чтобы выяснить, почему этот столбец возвращал другой тип вместо DATETIME (или DATETIME2 и т. д.)

  2. если это значение SqlDateTime и оно содержит миллисекунды, то я бы посчитал приведение в качестве источника проблемы. Чтобы проверить это, я бы попробовал (в отладчике или в коде) SqlDataReader.GetDateTime () и SqlDataReader.GetSqlDateTime (), чтобы увидеть, возвращает ли любой из них правильный результат. Это по общему признанию кажется действительно маловероятным, поскольку источник проблемы - кастинг должен работать отлично.

  3. если это значение из # 1 равно SqlDateTime, но не содержит миллисекунд, то я бы обратился к проблеме восходящего потока в базе данных - другими словами, ваш запрос возвращает что-то без миллисекунд. Когда вы выполняете точно такой же запрос в Management Studio, вы видите миллисекунды?

Полагаю, это проблема, связанная с запросами. Но я заинтригован, чтобы найти больше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...