Несоответствие форматирования даты в SQL Server и коде C # - PullRequest
1 голос
/ 12 февраля 2010

У меня проблема.

У меня есть приложение на C # с SQL SERVER 2005 в качестве бэкэнда.

Проблема заключается в получении правильной записи на основе даты.

Код внешнего интерфейса

if (string.IsNullOrEmpty(txtFromDate.Text)) 
    SelectCmd.Parameters[0].Value = DBNull.Value;
else 
    SelectCmd.Parameters[0].Value = txtFromDate.Text;

Теперь, если я запускаю usp_NewGetUserDetail '03/04/2010' в анализаторе запросов, я могу получить правильную запись.

Так что я предпочитаю быть уверенным, что мой SP правильный (я проверял много вариантов).

Но если то же значение передается из кода внешнего интерфейса (SelectCmd.Parameters[0].Value = "03/04/2010";), я получаю неожиданную запись. Под этим я подразумеваю записи, которые не входят в диапазон дат.

Я полагаю, что существует некоторое несоответствие в формате даты в backend и frontend.

Пожалуйста, дайте мне знать, если я пропустил некоторую информацию, которую мне нужно предоставить для решения этой проблемы

Пожалуйста, помогите.

Ответы [ 3 ]

1 голос
/ 12 февраля 2010

Работа с датами на SQL Server - сложная задача, поскольку большинство форматов зависят от языка и локали. Как уже упоминал Адам - ​​вы должны стараться избегать работы с датами в виде строк - это становится беспорядочным, и использование DateTime (как в .NET, так и в T-SQL) намного безопаснее и проще.

Но если вы должны использовать строки, то помните об этих моментах: дата, такая как 02/05/2010, будет интерпретироваться как 5 февраля 2010 года в некоторых местах или как 2 мая 2010 года в других. Поэтому, что бы вы ни делали - вы всегда будете сталкиваться с кем-то, у кого другие настройки и у вас другие результаты.

Здесь можно использовать формат ISO-8601 , который не зависит от языковых и языковых настроек и работает всегда.

Так что для ваших дат всегда использует формат ГГГГММДД - во-первых, он всегда работает, а во-вторых, с этим форматом вы получаете «естественное» поведение сортировки - отсортировано по году, потом месяц, потом день.

0 голосов
/ 12 февраля 2010

Попробуйте что-то вроде этого:

DateTime fromDate;
if (DateTime.TryParse(txtFromDate.Text, out fromDate))
{
    SelectCmd.Parameters[0].Value = fromDate
}
else
{
    SelectCmd.Parameters[0].Value = DBNull.Value;
}
0 голосов
/ 12 февраля 2010

Нет необходимости передавать дату в виде строки, и не должен вас. Установите значение параметров для объекта DateTime, который представляет желаемую дату, а не ее строковое представление.

...