C #, построить SQL, чтобы выбрать пользователя по возрасту - PullRequest
0 голосов
/ 24 ноября 2010

У меня есть таблица талантов, в которой у всех моих пользователей есть столбец с именами их дней рождения. Что было бы лучшим способом Талант в указанном возрастном диапазоне. Вот что у меня есть, но, кажется, на пару дней. есть ли лучший способ?

// BUILD SQL FROM FORM DATA
sqlString += "SELECT * from Talent";

if (minAge != 0 || maxAge != 120)
{
     // The age criteria has been change, filter by age.

     // select all talents that have birthdays between the following 2 dates.
     DateTime startDate = (DateTime.Now - new TimeSpan((maxAge * 365), 0, 0, 0));  // maxAge * 365 = totalDays
     DateTime endDate = (DateTime.Now - new TimeSpan((minAge * 365), 0, 0, 0));
     sqlString += " WHERE Birthdate BETWEEN '" + startDate.ToString() + "' AND '" + endDate.ToString() + "'";
}

Ответы [ 5 ]

1 голос
/ 24 ноября 2010

Если вы используете SQL Server ...

using (var connection = new SqlConnection(connString))
    using (var command = connection.CreateCommand()) {

        string tsql = @"
            select *
                from Talent
                where DATEDIFF(YEAR, BirthDay, GETDATE()) BETWEEN @minAge AND @maxAge";

        command.CommandText = tsql;
        command.CommandType = CommandType.Text;

        int minAge = 1;
        int maxAge = 120;

        SqlParameter minAgeParam = command.CreateParameter();
        minAgeParam.Direction = ParameterDirection.Input;
        minAgeParam.DbType = SqlDbType.TinyInt;
        minAgeParam.ParameterName = "@minAge";
        minAgeParam.Value = minAge;

        SqlParameter maxAgeParam = command.CreateParameter();
        maxAgeParam.Direction = ParameterDirection.Input;
        maxAgeParam.DbType = SqlDbType.TinyInt;
        maxAgeParam.ParameterName = "@maxAge";
        maxAgeParam.Value = maxAge;

        // Just unsure here whether I must add the parameters to the command,
        // or if they are already part of it since I used the 
        // SqlCommand.CreateParameter() method. 
        // Been too long since I haven't done any ADO.NET
        command.Parameters.Add(minAgeParam);
        command.Parameters.Add(maxAgeParam);

        connection.Open();

        SqlDataReader reader = null;

        try {
            reader = command.ExecuteReader();
            // Process your records here...
        } finally {
            connection.Close()
            command.Dispose();
            connection.Dispose();
            if (reader != null) {
                reader.Dispose();
            }
        }
    }

Где @ minAge и @ maxAge - ваши параметры возраста.

Вы также можете указать DATEDIFF TSQL функцию , чтобы она учитывала разницу в днях, месяцах, часах, минутах, секундах и т. Д. Следовательно, вам придется соответствующим образом преобразовать значение ваших параметров.

0 голосов
/ 24 ноября 2010

Сколько стоит - ваше оригинальное решение отключено на несколько дней, потому что оно использует 365 вместо учета високосных лет.

0 голосов
/ 24 ноября 2010

Возможно, проблема связана с DateTime.Now, который учитывает время и дату.Попробуйте заменить его на DateTime.Today.

0 голосов
/ 24 ноября 2010

Почему вы не используете DateTime.AddYears метод.

DateTime startDate = DateTime.Now.AddYears(-maxAge);

изолированный

DateTime startDate = (DateTime.Now - new TimeSpan((maxAge * 365), 0, 0, 0)); 

Другое дело: пожалуйста, не используйте *Оператор 1009 * между строками для создания SQL-запроса, используйте StringBuilder.

0 голосов
/ 24 ноября 2010

Лично я обнаружил, что использование startDate.ToString("yy-MM-dd 00:00:00.000") и endDate.ToString("yy-MM-dd 23:59:59.000") работает лучше всего (обратите внимание, 000 в диапазоне дат окончания. По некоторым причинам, по моему опыту, sql выключен (возможно, из-за некоторой ошибки округления)) когда дело доходит до диапазонов.

Кроме того, вы можете использовать статические методы из объекта TimeSpan для расчета времени. Например, TimeSpan.FromDays(...)

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