SQL-оператор с указателем даты и времени - PullRequest
2 голосов
/ 10 сентября 2009

Надеюсь, это должно быть просто. При использовании выбора даты и времени в форме окна я хочу, чтобы выполнялся оператор SQL, например:

string sql = "SELECT * FROM Jobs WHERE JobDate = '" + dtpJobDate.Text + "'";

К сожалению, на самом деле это не дает никаких результатов, поскольку поле JobDate хранится в виде значения DateTime. Я хотел бы иметь возможность искать все записи, которые находятся на эту дату, независимо от того, какое время может быть сохранено, любая помощь?

Новый запрос:

        SqlDataAdapter da2 = new SqlDataAdapter();
        SqlCommand cmd = new SqlCommand();
        cmd.CommandText = "SELECT * FROM Jobs WHERE JobDate >= @p_StartDate AND JobDate < @p_EndDate";
        cmd.Parameters.Add ("@p_StartDate", SqlDbType.DateTime).Value = dtpJobDate.Value.Date;
        cmd.Parameters.Add ("@p_EndDate", SqlDbType.DateTime).Value = dtpJobDate.Value.Date.AddDays(1);
        cmd.Connection = conn;
        da2.SelectCommand = cmd;
        da2.Fill(dt);
        dgvJobDiary.DataSource = dt;

Огромное спасибо за помощь!

Ответы [ 4 ]

9 голосов
/ 10 сентября 2009

Всего один ответ: используйте параметризованные запросы .

Это по разным причинам:

  • безопасность (без риска SQL Инъекции
  • больше не те проблемы, для которых вы открываете тему
  • производительности.

Итак, напишите ваше утверждение так:

SqlCommand cmd = new SqlCommand();
cmd.CommandText = "SELECT * FROM Jobs WHERE JobDate = @p_Date"
cmd.Parameters.Add ("@p_Date", SqlDbType.DateTime).Value = dtpJobDate.Value;

Если вы хотите игнорировать время, то я думаю, что лучше всего делать поиск диапазона, если время хранится в БД, то есть. Примерно так (только SQL-запрос):

SELECT * FROM Jobs WHERE JobDate >= @p_StartDate AND JobDate < @p_EndDate

Тогда StartDate будет dtpJobDate.Value.Date, а EndDate будет dtpJobDate.Value.Date.AddDays(1)

Если время не хранится в БД, то вы можете сделать это:

SELECT * FROM Jobs WHERE JobDate = @p_Date

где аргумент поиска должен быть dtpJobDate.Value.Date

1 голос
/ 10 сентября 2009

Кроме вещей SQL-инъекций в других ответах, вы можете использовать что-то вроде этого:

dtpJobDate.Value.ToString("yyyyMMdd HH:mm:ss");

Но, вероятно, вы не найдете ничего с точным совпадением времени, поэтому вы можете изменить свой запрос на что-то вроде

string sql = "SELECT * FROM Jobs WHERE JobDate BETWEEN '" + dtpJobDateStart.Value.ToString("yyyyMMdd HH:mm:ss") + "' AND '" + + dtpJobDateEnd.Value.ToString("yyyyMMdd HH:mm:ss") + " + "'";
1 голос
/ 10 сентября 2009

Попробуйте dtpJobDate.Value.

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

Прежде всего - вы оставили дверь открытой для внедрения SQL в вашем примере.

Кроме этого - чтобы ответить на ваш вопрос, вам нужно будет опустить время в столбце JobDate, чтобы получить соответствие. Попробуйте что-то вроде этого (код SQL Injection оставлен в примере для сравнения) ...

string sql = "SELECT * FROM Jobs WHERE CAST(CONVERT(CHAR(8), JobDate, 112) AS DATETIME) = '" + dtpJobDate.Text + "'";

Если бы вы параметризировали свой запрос - вы могли бы сделать что-то вроде этого ...

using (var conn = new SqlConnection(myConnectionString))
using (var cmd = new SqlCommand("SELECT * FROM Jobs WHERE JobDate = @JobDate", conn))
{
    cmd.Parameters.Add(new SqlParameter("@JobDate", dtpJobDate.Value));

    conn.Open();
    using (var reader = cmd.ExecuteReader())
    {
        while (reader.Read())
        {
            // your code here to deal with the records...
        }
    }
}
...