Как правильно передать datetime из c # в sql? - PullRequest
26 голосов
/ 04 июля 2011

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

2011-07-01 15:17:33.357

Я принимаю ac # 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;
                }
            }


        }

ОБНОВЛЕНИЕ *******************

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

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 (07.04.2011, 07:19:58) из c # в SQL, никакие записи вообще не отображаются!

Ответы [ 2 ]

22 голосов
/ 04 июля 2011

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

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

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

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

7 голосов
/ 04 июля 2011

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

  1. В SQL Server я использую тип столбца DateTime
  2. В c # я использую .ToString ("гггг-ММ-дд ЧЧ: мм: сс") method

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

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

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

РЕДАКТИРОВАТЬ: hh был заменен на HH, так как он, кажется, не фиксирует правильный час в системах с AM / PM, в отличие от систем с 24-часовыми часами.Смотрите комментарии ниже.

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