Синтаксический
Вы можете использовать DateTime.TryParseExact, чтобы проанализировать строку в DateTime, требуя, чтобы она была в точном формате. Это устранит проблему, заключающуюся в том, что вы сможете проанализировать недопустимую дату в экземпляре DateTime.
Вот пример:
DateTime dt;
if (DateTime.TryParseExact("March 16", "MMMM dd", new CultureInfo("en-GB"), DateTimeStyles.None, out dt))
Console.WriteLine(dt);
Если пропустить год, TryParseExact будет считать текущий год. Если вы передадите «16-17 марта» этому методу, он потерпит неудачу. Параметр IFormatProvider является английской культурой, поэтому мы можем считать «март» 3-м месяцем года.
Как вы заметили, это не то же самое, что делает SQL Server. Как он конвертирует даты, будет зависеть от настроек сортировки. Я бы не рекомендовал это, но если вам действительно, действительно нужно точно воспроизвести эту функциональность и использовать ее из C #, вы можете создать хранимую процедуру, которая принимает varchar, выполняет преобразование и возвращает DateTime - и позвоните из C #.
Вы также можете использовать метод DateTime.TryParse для анализа даты в C #. Этот метод также принимает IFormatProvider, который сообщает платформе, как выполнять анализ. IFormatProvider реализован CultureInfo, поэтому, если вы передадите CultureInfo, который соответствует параметрам сортировки SQL Server, где вы наблюдали желаемое поведение, есть вероятность, что результаты анализа будут похожими. Наконец, вы можете сделать собственную реализацию IFormatProvider, если вы не удовлетворены встроенными возможностями.
Мои комментарии
Ваша настоящая проблема заключается в том, что вы фактически делаете проверку и преобразование из строки в DateTime дважды. Оказавшись в C #, вы отправляете строку на SQL Server и снова преобразуете ее. Это может создать проблемы, поскольку, как вы заметили, две системы анализируют одинаково, но не совсем одинаково в крайних случаях.
Я думаю, вам следует выполнить проверку и синтаксический анализ в C #, а затем отправить полученный DateTime на SQL Server в виде объекта DateTime, поэтому самому SQL Server не требуется выполнять анализ. Вы можете сделать это с помощью параметризованных запросов в ADO .NET - если вы используете что-то другое для доступа к данным, будет аналогичная функция.