Как правильно передать значение 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, никаких записей вообще не появляется!
Ответы
Ответ 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 апреля", это зависит от конфигурации локализации вашего сервера (мое решение не страдает от этой проблемы).