«Независимый от базы данных путь» обычно является синонимом «медленного пути», поэтому решения вряд ли будут эффективными.
Анализ всех записей на стороне клиента будет наименее эффективным решением в любом случае.
Вы можете обработать строку локали на стороне клиента и сформировать правильное условие для оператора LIKE
, RLIKE
или REGEXP_SUBSRT
. Конечно, клиентская сторона должна знать о базе данных, которую использует система.
Затем вы должны применить оператор к строке, сформированной в соответствии с языковым стандартом, с функцией форматирования, специфичной для базы данных, например: (Oracle
):
SELECT *
FROM mytable
WHERE TO_CHAR(mydate, 'dd.mm.yyyy - hh24.mi') LIKE '15\.10'
Более эффективным способом (который работает только в PostgreSQL
, однако) будет создание индекса GIN
для отдельных дат:
CREATE INDEX ix_dates_parts
ON dates
USING GIN
(
(ARRAY
[
DATE_PART('year', date)::INTEGER,
DATE_PART('month', date)::INTEGER,
DATE_PART('day', date)::INTEGER,
DATE_PART('hour', date)::INTEGER,
DATE_PART('minute', date)::INTEGER,
DATE_PART('second', date)::INTEGER
]
)
)
и использовать его в запросе:
SELECT *
FROM dates
WHERE ARRAY[11, 19, 2010] <@ (ARRAY
[
DATE_PART('year', date)::INTEGER,
DATE_PART('month', date)::INTEGER,
DATE_PART('day', date)::INTEGER,
DATE_PART('hour', date)::INTEGER,
DATE_PART('minute', date)::INTEGER,
DATE_PART('second', date)::INTEGER
]
)
LIMIT 10
При этом будут выбраны записи, имеющие все три числа (1
, 2
и 2010
) в любой из дат: например, все записи Novemer 19 2010
плюс все записи 19:11
в 2010
и т. д.