2010-08-05 2 views
2

Один из моих столбцов таблицы по имени «SETDATE» типа DateTime выглядит так:Как настроить Формат даты

2010-08-02 02:55:58.420 

Формат DateTime из приложения выглядит так:

2/11/2010 

Проблема заключается в том :

Я передаю SQL-запрос в БД через приложение. Запрос имеет предложение WHERE , которое сравнивает SetDate с датой, поступающей из приложения.

колонка SETDATE осуществляет этот формат: 2010-08-02 02:55:58.420
Дата передается от приложения осуществляет этот формат: 3/12/2010

Я просто нужно сравнить две даты без времени 2010-08-02 и 3/12/2010.
Поскольку они находятся в разных форматах, я не получаю никаких записей из базы данных.

Я использую C# и T-SQL.

Любые идеи?

+1

Приложение не позволяет отправлять параметризованные запросы? –

+1

Как вы строите запрос в своем приложении? Сохранить proc? Параметрированный запрос? ... – Jaime

+0

В моем случае я жестко кодирую запрос временно. – user311509

ответ

0

Попробуйте что-то вроде:

SELECT 
    * 
FROM 
    YourTable 
WHERE 
    RTRIM(CONVERT(CHAR(19), SetDate, 101)) = '3/12/2010' 
+0

Запустив coversion в столбце, а не на переданное значение, нет возможности использовать индекс. Кроме того, если вы собираетесь сравнивать даты как строки, гораздо лучше использовать формат нейтрального языка (например, YYYYMMDD), который в любом случае снова указывает на преобразование переданного значения. –

+0

Я не знал о проблеме с индексом, спасибо за указание на это. Однако, если запрос, необходимый для получения записей для определенной даты, независимо от времени, я бы подумал, что вам все равно нужно выполнить преобразование как по столбцу, так и по переданному значению. В противном случае вам нужно будет запросить элементы между минимальной датой/временем и максимальной датой/временем в тот же день (что может быть лучше, так как вы можете воспользоваться этим индексом). –

+0

Спасибо, на самом деле это решение сработало для меня! – user311509

0

В вашей ИНЕКЕ, вы можете использовать Date член класса DateTime DateTime.Now.Date. Он возвращает дату без времени.

До тех пор, пока вы работаете с объектами Date (.net или SQL-сервером), формат не имеет значения, так как ваша задача заключается в анализе строки на объект или в обратном направлении, внутренне формат не имеет значения.

2

Используете ли вы SqlCommand для выполнения запроса?

Да? Также используйте SqlParameters для пользователей/системных входов.

var setDate = DateTime.Now(); 

using (SqlCommand command = new SqlCommand("SELECT * FROM TableX WHERE SetDate > @SetDate", connection)) 
{ 
    // Add new SqlParameter to the command. 
    command.Parameters.Add(new SqlParameter("@SetDate", SqlDbType.DateTime, setDate)); 
    // Read in the SELECT results. 
    SqlDataReader reader = command.ExecuteReader(); 
    //More code 
} 
1

На вас предложение WHERE для DATETIME в базе данных вам нужно сделать что-то вроде этого. CONVERT (DATETIME, CONVERT (VARCHAR (11), '2010-08-02 02: 55: 58.420'))

0

Лучший способ запуска запросов БД из кода - вызов хранимых процедур, если это возможно. Однако, независимо от того, делаете вы это или нет, вы захотите использовать объект SqlParameter, инициализированный с нужной датой.

DateTime dateToCheck = DateTime.Now; 
using(SqlCommand cmd //Set Command Here) 
{ 
    cmd.CommandType = SqlCommandType.Procedure; 
    //Doing this from memory, but that line should be pretty close 
    cmd.Parameters.AddWithValue("@dateToCheck", dateToCheck); 

    //Continue with call to DB as normal 
} 

Не здесь, некоторые люди указать тип «DateTime» на их объекте SqlParameter, но я никогда не делал этого, и он не вернулся, чтобы укусить меня, но. Я верю (опять же, отключая память здесь), что если вы используете системный. [Любой] тип, SqlParameter может автоматически назначить его правильному типу Sql. Таким образом, передача строки может по-прежнему выдавать строку, но передача DateTime приведет к дате DateTime.

Смежные вопросы