Как лучше всего запрашивать даты в SQL, когда параметризованные запросы невозможны - PullRequest
4 голосов
/ 23 сентября 2011

Мое краткое изложение состоит в том, чтобы реализовать интерфейс, который имеет метод, который выглядит примерно так: 'GetValuesSqlStatement' ниже:

public string SqlPattern { get { ... } }
//this varies; eg. "SELECT name FROM someTable WHERE startDate < {0}"

public string DatabaseType { get { ... } }
//this varies; eg. "SqlServer"

public string GetValuesSqlStatement(List<object> paramValues)
{
    //...desired logic here, using DatabaseType, SqlPattern and paramValues
}

Теперь, поскольку это должно привести к выполнению исполняемого оператора SQL, я не могу использовать параметры ввыполнение запроса.И интерфейс, который я должен реализовать, не подлежит обсуждению.Каков наилучший способ убедиться, что даты в результате правильно интерпретируются обработчиком запросов к базе данных?Предполагая, что paramValues ​​содержат объекты .NET DateTime, как их отформатировать в строку перед подключением к строке шаблона SQL?Каков наиболее распространенный универсальный формат даты в базах данных must?(например, что-то вроде «дд-ммм-гггг»).

Примечание: мне действительно нужно беспокоиться о Sql Server начиная с 2005 года и Oracle 10g и далее.Таким образом, SQL должен быть действительным T SQL и PL SQL и означать одно и то же в обоих вариантах.

Ответы [ 3 ]

1 голос
/ 23 сентября 2011

Я думаю, что единственным однозначным форматом даты для SQL Server является ГГГГММДД:

Oracle использует ДАТУ 'YYYY-MM-DD':

http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/sql_elements003.htm#BABGIGCJ

Хотя в некоторых сценариях может существовать нотация, которая работает для обеих систем, я сомневаюсь, что есть нотация, которая работает для обеих сторон со всеми возможными настройками региональных серверов.

Как вы сказали, YYYY-MON-DD может быть полезен - по умолчанию Oracle.

1 голос
/ 23 сентября 2011

Если вы используете формат даты 'гггг-мм-дд' с любой БД, все будет в порядке.Это соответствует ISO 8601 (http://www.iso.org/iso/date_and_time_format)

0 голосов
/ 23 сентября 2011

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

Я только что понял, что могу просто ожидатькаждый экземпляр (или каждый клиент в другой части мира), чтобы дополнительно указать строку формата в последней части заполнителя параметра.Например.реализация:

public string SqlPattern { get {
    return "SELECT name FROM someTable WHERE startDate < {0:yyyy-mm-dd}";
} }  

И тогда моему компоненту не нужно беспокоиться о том, как форматировать дату вообще.По умолчанию я могу использовать «ггггммдд» или, что еще лучше, просто использовать культуру сервера, чтобы выбрать значение по умолчанию.В противном случае используйте пользовательский шаблон.Это будет общий подход, применимый к другим типам, которые также должны быть отформатированы в строку для SQL.

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