Запрос SQL Server на сегодняшнюю дату с использованием datetime2

У меня есть база данных SQL Server, и когда я открываю ее на экране, я хочу, чтобы она просто показывала записи, которые были добавлены сегодня.

У меня есть дата, хранящаяся в поле с именем DateAdded, и она имеет тип данных DateTime2.

я пробовал это

string dateAdded = today.ToShortDateString();

string query = "SELECT CustomerID, Title, FirstName, LastName, AppStatus 
FROM Customer     
WHERE DateAdded ='" + dateAdded + "'";

Это не отображает никаких записей, которые я бы предположил, поскольку атрибут времени хранится вместе с датой.

Я искал в Интернете, чтобы попытаться найти ответ, но, похоже, ни один из них не касался только записей, добавленных сегодня.

Мне также потребуется выполнить поиск по диапазонам дат на основе пользовательских данных, и это может быть любой диапазон, например, просмотр записей с 01.09.2013 по 18.03.2013.

Каков наилучший способ написать sql-запрос для этого?

РЕДАКТИРОВАТЬ - мой ответ

Ответ, который дал Карл, сработал, но я не понял, как изменить значения, чтобы иметь разные диапазоны дат. Я думаю, что должен опубликовать здесь свой окончательный результат, основанный на полученных ответах, так что это может помочь кому-то еще. :)

using (SqlConnection conn = new SqlConnection(connectionString))
        {
            int year = date1.Year;
            int month = date1.Month;
            int day = date1.Day;

            string dateAdded = year + "-" + month + "-" + day + " ";

            int year2 = date2.Year;
            int month2 = date2.Month;
            int day2 = date2.Day;

            string dateAdded2 = year2 + "-" + month2 + "-" + day2 + " ";

            string query = "SELECT CustomerID, Title, FirstName, LastName, AppStatus, DateAdded FROM Customer WHERE DateAdded >= @date1 AND DateAdded <= @date2";

            using (SqlCommand cmd = new SqlCommand(query, conn))
            {
                cmd.Parameters.AddWithValue("date1", dateAdded + "00:00:00");
                cmd.Parameters.AddWithValue("date2", dateAdded2 + "23:59:59");
                SqlDataAdapter da = new SqlDataAdapter(cmd);
                da.Fill(holder);
            }
        }

person saintsfanuk    schedule 10.04.2013    source источник
comment
Вы должны использовать параметризованный запрос и использовать параметр для даты, которую вы хотите добавить; этот параметр может иметь тип DateTime и, таким образом, обрабатывать ваши данные   -  person marc_s    schedule 10.04.2013
comment
Пожалуйста, для хорошей практики используйте параметры. Или еще лучше используйте SQL с a для достижения этой цели. SELECT CONVERT(VARCHAR(8), GETDATE(), 1) AS [ММ/ДД/ГГ] sql-server-helper.com/tips/date-formats.aspx   -  person Ash    schedule 10.04.2013
comment
Конвертация ужасна. Должны ли мы использовать DATEADD(day, DATEDIFF(day, 0, GETDATE()), 0).   -  person Po-ta-toe    schedule 10.04.2013
comment
За исключением того, что это также дает вам время, которого нет в ToShortDateString().   -  person Ash    schedule 10.04.2013
comment
Это дает вам полночь, toshortdate не имеет времени в строке, но будет иметь 00:00:00 как время в SQL   -  person Po-ta-toe    schedule 10.04.2013
comment
При дальнейшем осмотре кажется, что это его проблема. Кажется, помогает читать вещи целиком.   -  person Ash    schedule 10.04.2013


Ответы (3)


Из ответов ОП изменился SQL на этот

DECLARE @StartDate DATETIME2, @EndDate DATETIME2

SET @StartDate = DATEADD(day, DATEDIFF(day, 0, GETDATE()), 0)
SET @EndDate = DATEADD(day, DATEDIFF(day, 0, GETDATE()+1), 0)

SELECT CustomerID, Title, FirstName, LastName, AppStatus 
    FROM Customer     
    WHERE DateAdded >= @StartDate AND DateAdded < @EndDate

Это получит что-нибудь на текущую дату (вы можете заменить Getdate() на дату по вашему выбору для повторного использования)

person Po-ta-toe    schedule 10.04.2013
comment
Однако я бы предостерег от использования встроенного SQL. Это приводит к потенциальным атакам SQL Injection. - person Po-ta-toe; 10.04.2013
comment
Вы храните время с вашими датами? Если это так, то нет, это не сработает, и вам нужно будет сделать подход между полуночью и 23:59:59. - person Po-ta-toe; 10.04.2013
comment
Да, как говорится, я использую поле datetime2, в котором также хранится время. :) - person saintsfanuk; 10.04.2013
comment
Отредактировал мой ответ, чтобы учесть ваш ответ - person Po-ta-toe; 10.04.2013
comment
SQL Server дал мне синтаксическую ошибку, поэтому я попытался, мне нужно было снова добавить DateAdded после AND. Спасибо. - person saintsfanuk; 10.04.2013
comment
Ах да, изначально я делал это как промежуточный вариант, но потом понял, что вы получите все, что создано, ровно в полночь следующего дня. Сейчас отредактирую - person Po-ta-toe; 10.04.2013

Как насчет этого:

var sqlCommand = new SqlCommand();
sqlCommand.CommandText = "SELECT CustomerID, Title, FirstName, LastName, AppStatus FROM Customer WHERE DateAdded >= @DateAdded";
sqlCommand.Parameters.AddWithValue("@DateAdded", DateTime.Today);
person Oliver    schedule 10.04.2013
comment
Я настоятельно рекомендую этот метод, потому что, во-первых, он использует параметры, и вам не придется возиться с форматом даты и текущей культурой, во-вторых, вы защищены от искаженного sql и инъекций. - person Oybek; 10.04.2013
comment
За исключением того, что это не работает с моей проблемой, конечно, было бы, если бы это было просто поле даты, которое я себе представляю. - person saintsfanuk; 10.04.2013
comment
@saintsfanuk: Это была простая арифметическая ошибка. В предложении where вы должны проверить на больше или равно, а не только на равно. После этого изменения это утверждение также должно работать. - person Oliver; 10.04.2013
comment
Ах, теперь я вижу, извините, я думал, что это из-за поля datetime2, которое я использую, вы правы, это тоже работает. - person saintsfanuk; 10.04.2013

Попробуйте свой SQL-запрос, как показано ниже.

Запрос:

string query = "SELECT CustomerID, Title, FirstName, LastName, AppStatus FROM Customer
WHERE CONVERT(VARCHAR(10), dateAdded, 101) = CONVERT(VARCHAR(10), @DateAdded, 101)";

Параметризированная команда:

string dateAdded = today.ToShortDateString();
SqlCommand cmd = new SqlCommand();
cmd.CommandText = query ;
cmd.Parameters.AddWithValue("@DateAdded", dateAdded);
person Pandian    schedule 10.04.2013
comment
DateAdd более эффективен, чем convert, поскольку преобразование данных отсутствует. Также использование convert в левой части предложения where является массовым нет-нет. - person Po-ta-toe; 10.04.2013
comment
@CarlSixsmith Но пользователь сохраняет информацию о дате с датой и временем ... без преобразования, как сопоставить дату ...? - person Pandian; 10.04.2013
comment
Смотрите мой ответ: преобразование фактических данных не позволит SQL использовать какие-либо индексы или статистику для столбца. - person Po-ta-toe; 10.04.2013