Подтвердить что ты не робот

Как правильно передать значение datetime из С# в sql?

У меня есть таблица, а дата-время в ней:

2011-07-01 15:17:33.357

Я беру С# DateTime, когда я делаю .ToString() для объекта, в котором я получаю DateTime в формате:

04/07/2011 06:06:17

Мне интересно, как правильно передать правильную DateTime, потому что, когда я запускаю SQL, который находится в нашем коде, он не работает (т.е. выбирает правильную DateTime). Я не могу использовать профилировщик SQL.

Это код:

//looks to if a user has had any activity in within the last time specified
        public bool IsUserActivitySinceSuppliedTime(int userId, DateTime since)
        {
            //get everything since the datetime specified [usually 5 hours as this is 
            //how long the session lasts for
            string sql = "SELECT * FROM tbl_webLogging WHERE userid = @userid AND DateAdded > @sinceDateTime";

            SqlParameter sinceDateTimeParam = new SqlParameter("@sinceDateTime", SqlDbType.DateTime);
            sinceDateTimeParam.Value = since;

            SqlCommand command = new SqlCommand(sql);
            command.Parameters.AddWithValue("@userid", userId);
            command.Parameters.Add(sinceDateTimeParam);


            using (SqlDataReader DataReader = GetDataReader(command))
            {
                if (DataReader.HasRows)
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }


        }

UPDATE *******************

Я запустил следующие данные:

SELECT * FROM tbl_webLogging 
WHERE userid = 1 
AND DateAdded > '2011-07-01 07:19:58.000'

и

SELECT * FROM tbl_webLogging 
WHERE userid = 1 
AND DateAdded > '04/07/2011 07:19:58'

Один возвращает 53 записи, другой возвращает 69 записей. Как это может быть? И когда я передаю DateTime (04/07/2011 07:19:58) из С# в SQL, никаких записей вообще не появляется!

4b9b3361

Ответ 1

Вы уже сделали это правильно, используя параметр DateTime со значением из DateTime, поэтому он должен работать уже. Забудьте о ToString() - так как это не используется здесь.

Если есть разница, скорее всего, это будет связано с различной точностью между двумя средами; возможно, выберите округление (секунды, может быть?) и используйте это. Также имейте в виду UTC/local/unknown (у БД нет понятия "вид" даты,.NET делает).

У меня есть таблица, а дата-время в ней: 2011-07-01 15:17:33.357

Обратите внимание, что время в базе данных не находится в таком формате; это просто ваш запрос-клиент, показывающий вам белую ложь. Он хранится как число (и даже это деталь реализации), потому что у людей есть эта странная тенденция не понимать, что указанная вами дата совпадает с 40723.6371916281. Глупые люди. Рассматривая это просто как "дату-время", вы не должны испытывать никаких проблем.

Ответ 2

У меня было много проблем с С# и SqlServer. В итоге я сделал следующее:

  • В SQL Server я использую тип столбца DateTime
  • В С# я использую метод .ToString( "yyyy-MM-dd hh: mm: ss" )

Также убедитесь, что все ваши компьютеры работают в одном и том же часовом поясе.

Что касается различных наборов результатов, которые вы получаете, ваш первый пример: "First First" , а второй - "4 июля" ...

Кроме того, второй пример можно также интерпретировать как "7 апреля", это зависит от конфигурации локализации вашего сервера (мое решение не страдает от этой проблемы).