Невозможно выбрать записи в диапазоне дат - PullRequest
0 голосов
/ 16 июня 2019

В моем приложении Windows Form C # я вставляю запись в базу данных сервера SQL. Наряду с другими полями я также вставляю текущую дату и текущее время в следующем формате:

DateTime currentDate = DateTime.Now;
string SaleDate = currentDate.ToString("dd-MM-yyyy");

DateTime currentTime = DateTime.Now;
string SaleTime = currentTime.ToString("hh:mm:ss tt");

Работает нормально, и записи успешно вставляются в формате даты и времени, например this.

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

Я использую следующий запрос выбора в своем приложении для выбора записей в представлении vAllSales, в результате чего выбираются либо все записи, либо записи, чья SaleDate не соответствует заданным критериям фильтра:

select * from vAllSales where SaleDate >= '20-04-2019' and SaleDate <= '30-04-2019'"

Я попытался также выполнить следующие запросы на моем SQL-сервере, чтобы проверить причину:

1

select * from vAllSales where SaleDate between '21-04-2019' and '09-05-2019'

Приведенный выше запрос не возвращает никакого значения. Как this

2.

select * from vAllSales where SaleDate >= '21-04-2019'

Приведенный выше запрос выбирает только несколько записей. Поскольку 21-04-2019 является исходным SaleDate, и запрос должен вернуть все Sales, но он возвращает только несколько записей, например this.

Есть ли проблемы с указанным форматом даты в моем коде? Или я должен работать над улучшением моих запросов? Мне нужен более профессиональный и надежный подход к этому делу.

Ответы [ 2 ]

3 голосов
/ 16 июня 2019

Вы должны хранить свою дату и время как datetime2 объекты в вашей базе данных.

Это даст вам следующие преимущества:

  • улучшенная сортировка :(ваш текущий формат строки не допускает естественную сортировку)
  • лучшая производительность;поскольку ваши дата и время представлены в виде чисел вместо строк,
  • легче обрабатывать в коде и запросах: так как они отображаются непосредственно на объект C # DateTime.

Для более подробной информацииинформацию о типах баз данных см .:

https://docs.microsoft.com/en-us/sql/t-sql/data-types/datetime2-transact-sql?view=sql-server-2017

И, возможно:

https://docs.microsoft.com/en-us/sql/t-sql/data-types/time-transact-sql?view=sql-server-2017

Если вам абсолютно необходимо использовать строку для представления даты, убедитесь, что она в сортируемом формате ISO .

YYYY-MM-DD

, поскольку этот формат имеет характер лексикографический сортируется как строковый тип.

1 голос
/ 16 июня 2019

Вы пытаетесь применить логические операции к строковым значениям. Здесь произойдет лексикографическое сравнение. (слева направо).

Так что вам лучше использовать правильные типы данных для хранения данных в таблице.

Но если вы действительно хотите сохранить дату в виде строки, вы должны привести ее к соответствующим типам данных перед сравнением.

select * from vAllSales where  CAST(SaleDate AS DATE) >= '21-04-2019'

Имейте в виду, что сервер ms sql использует одинарные кавычки для даты и времени прохождения. Это не значит, что это строки или varchar

...