выполнение запросов с указанием даты и времени в предложении WHERE - PullRequest
2 голосов
/ 05 октября 2010

Я использую SQL Server 2008 R2 в качестве хранилища данных.

До сих пор на тестовой машине у меня была английская версия программного обеспечения, и я делал запросы, форматируя поле datetime как

fromDate.ToString("MM/dd/yyyy");

Теперь я развернул базу данных на другом сервере на итальянском языке. Я изменю формат в моем коде на

fromDate.ToString("dd/MM/yyyy");

Есть ли способ сделать запрос в нейтральном формате?

спасибо!

EDIT

Я забыл упомянуть, что я использую NetTiers с CodeSmith. Вот полный образец

AppointmentQuery aq = new AppointmentQuery(true, true);
aq.AppendGreaterThan(AppointmentColumn.AppointmentDate, fromDate.ToString("MM/dd/yyyy"));
aq.AppendLessThan(AppointmentColumn.AppointmentDate, toDate.ToString("MM/dd/yyyy"));
AppointmentService aSvc = new AppointmentService();
TList<Appointment> appointmentsList = aSvc.Find(aq);

Ответы [ 3 ]

4 голосов
/ 05 октября 2010

Вам следует поделиться кодом, который вы используете для выполнения запроса, но я предполагаю, что вы строите SQL-запрос динамически, используя строковые конкататы для построения запроса и аргументов.Вам лучше использовать параметризованный запрос, тогда вы можете передавать данные как объект даты, и вам не нужно конвертировать строку.

Например, если ваш запрос может быть примерно таким:

DateTime fromDate = DateTime.Now;

SqlCommand cmd = new SqlCommand(
  "select * from Orders where fromDT = @fromDate", con);

cmd.Parameters.AddWithValue("@fromDate", fromDate);

...

Как хороший побочный эффект, это уменьшит ваш риск SQL-инъекции . Обновление: После вашего редактирования, которое значительно меняет контекст вопроса, и я должен признать, что у меня есть нулевые знания о проекте .netTiers.Но просто из любопытства вы пытались просто передать экземпляры даты напрямую, как показано ниже:

AppointmentQuery aq = new AppointmentQuery(true, true); 
aq.AppendGreaterThan(AppointmentColumn.AppointmentDate, fromDate); 
aq.AppendLessThan(AppointmentColumn.AppointmentDate, toDate); 
AppointmentService aSvc = new AppointmentService(); 
TList<Appointment> appointmentsList = aSvc.Find(aq); 
2 голосов
/ 06 октября 2010

ISO 8601 Элементы данных и форматы обмена - Обмен информацией - Представление даты и времени допускается как ГГГГ-ММ-ДД, так и ГГГГММДД.SQL Server распознает спецификации ISO.

Хотя стандарт допускает оба формата: ГГГГ-ММ-ДД и ГГГГММДД для полного представления календарной даты, если день [ДД] опущен, то разрешен только формат ГГГГ-ММ.Запрещая даты в формате ГГГГММ, стандарт позволяет избежать путаницы с усеченным представлением ГГММДД (все еще часто используется).

Я предпочитаю формат ГГГГММДД, но думаю, что только потому, что знал об этом, начатьс, и для меня это кажется более универсальным, покончив с символами, которые можно считать специфичными для локали.

1 голос
/ 05 октября 2010

Лично я всегда использую yyyy-MM-dd. Это также делает его сортируемым в виде строки.

Однако дата - это дата, это дата. Нет необходимости менять дату на строку. В .NET пользователь DateTime.

...