Поиск между немецкими датами, когда они являются строками - PullRequest
0 голосов
/ 21 февраля 2019

У меня есть проект MVC с двумя полями, в которые пользователь может ввести две даты.

Модель:

[DisplayName("Date From")]
public string DateFrom { get; set; }

[DisplayName("Date To")]
public string DateTo { get; set; }

Две даты принадлежат одному столбцу в базе данных, который называется * 1006.*.Этот диапазон дат является результатом.

В базе данных столбец OriginalDate является полем character varying.Синтаксис DD.MM.YYYY.

Когда пользователь вводит «Дата с» 14.02.2017 (DD.MM.YYYY) и «Дата до» 20.02.2019, как я могу достичь результата, что мой запроснаходит все результаты между этими двумя датами?

Рассматривал это утверждение:

SELECT * FROM tbl.tbl
WHERE OriginalDate BETWEEN '14.02.2017' AND '20.02.2019'

Это дает мне результат, но также и из других лет.Например DD.MM.1998 или DD.MM.2009.Как я должен привести, что это утверждение работает?

Тогда я попытался TO_DATE:

SELECT * FROM tbl.tbl
   WHERE OriginalDate BETWEEN TO_DATE('14.02.2017', 'DD.MM.YYYY')
                          AND TO_DATE('20.02.2019', 'DD.MM.YYYY')

Там я получаю эту ошибку:

LINE 1: SELECT * FROM tbl.tbl WHERE OriginalDate BETWEEN TO_DAT...
                                                      ^
HINT:  No operator matches the given name and argument type(s).
       You might need to add explicit type casts.
SQL state: 42883

Кроме того, этомой вопрос, если я приведу его к дате, он найдет его, когда столбец является символьной переменной?

Как я могу решить эту проблему?

1 Ответ

0 голосов
/ 22 февраля 2019

Вы можете создать эту функцию:

CREATE FUNCTION str2date(text) RETURNS date
   LANGUAGE sql IMMUTABLE AS
$$SELECT to_date($1, 'DD.MM.YYYY')$$;

Это нормально, поскольку она действительно неизменна.

Затем вы можете запросить:

... WHERE str2date(originaldate) BETWEEN str2date('10.12.2018')
                                     AND str2date('01.01.2019')

Вы даже можете создать индекс для ускорения этого процесса:

CREATE INDEX ON tbl.tbl (str2date(originaldate));

Конечно, было бы лучше сохранить данные как правильный тип данных.Таким образом, вы могли бы избежать подобных искажений.

...