2015-06-05 5 views
-1

Я пытаюсь сделатьКак я могу получить все записи за определенный месяц и год?

var dt = DateTime.Now.ToString(); 

string query = "SELECT * FROM Gigs where Date >= '"+dt+"';"; 

это, кажется, работает - за исключением того, что получает данные для будущих месяцев

Я тогда делать

var dt = DateTime.Now.AddMonths(3).ToString(); 

string query = "SELECT * FROM Gigs where Date >= '"+dt+"';"; 

И я получаю тот же результат, который не является ожидаемый

Если сегодня 1 января, я хочу получить все записи за январь, но не для февраля.

Это только для чтения данных, не касается SQL инъекции

+1

Вы говорите, что есть строки, в которых есть дата в ближайшие 3 месяца, которые включены в оба набора результатов? Также вы должны рассмотреть использование sql-параметров. – juharr

+1

Две вещи: ** 1. ** Вы получаете даты * позже * указанной даты, а не старше, и ** 2. ** пока вы в безопасности здесь, вы действительно должны всегда использовать параметризованные запросы, иначе вы будете уязвимы для атак SQL-инъекций – LittleBobbyTables

+0

«вы действительно должны всегда использовать параметризованные запросы», это новость для меня, знаете причину, по какой-либо причине? –

ответ

5

Прежде всего, почему вам нужно вычислить дату в C# и передать его в SQL запросе? Вы можете использовать DATEADD и GETDATE(), чтобы избежать этого:

--Will get three months before: 
select DATEADD(MONTH, 3, GETDATE()) 

Во-вторых, у вас есть три месяца в будущем. Вы уверены, что вы не хотите использовать -3:

var dt = DateTime.Now.AddMonths(-3).ToString(); 

Третье: использование параметризованных запросов, вот пример:

using (var connection = new SqlConnection("Data Source=.;Initial Catalog=Test;Integrated Security=SSPI;")) 
      { 
       connection.Open(); 
       using (var command = connection.CreateCommand()) 
       { 
        command.CommandText = "SELECT * FROM [Test].[dbo].[SomeDates] WHERE dt > @MyDate"; 
        var param = new SqlParameter("@MyDate", SqlDbType.DateTime2) { Value = DateTime.Now }; 
        command.Parameters.Add(param); 
        var result = command.ExecuteReader(); 
        while (result.Read()) 
        { 
         Console.WriteLine(result.GetDateTime(0)); 
        } 
       } 
      } 

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

Update # 2: Даже если вы не обеспокоены инъекции SQL (но вы должны быть), вы должны использовать параметризованные запросы, так как рамки будут заботиться о форматах даты и времени и преобразования. В противном случае он может работать на вашей машине, но не будет работать на другой машине/производстве.

+0

Что касается вашего второго пункта, они действительно, следует использовать '[Date] <= getdate()', чтобы получить меньше текущей даты (и использовать скобки вокруг 'Date', так как это зарезервированное слово) (если я неправильно понял значение« старше ») – LittleBobbyTables

+0

third точка - это ключ. +1 – ragerory

+0

Да, это то, о чем говорится. –

0

Если вы собираетесь преобразовать дату в строку, убедитесь, что настройки вашего региона не возвращают другую дату для SQL-сервера, если используются разные настройки региона. 5 июня может быть 05-06-2015 для вас, но если вы передадите это в sql-сервере с en-us, он будет интерпретировать его как 6 мая.

Преобразование с даты в строку для сервера sql всегда должно выполняться с использованием универсального формата yyyy-MM-dd, который не будет интерпретироваться неправильно в большинстве программ, независимо от региональных настроек.

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

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