Как искать профили в базе данных по дате создания - PullRequest
0 голосов
/ 21 января 2019

У меня есть профили с датой создания столбца (DATETIME) в базе данных. Мне нужно реализовать поисковые профили по дате в Java, которые будут возвращать все профили, созданные в определенный день или месяц.

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

Edit:

Да, этот запрос (из другого вопроса) работает:

SELECT * FROM profile WHERE DATE(creation_date) = '20190121';

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

Ответы [ 3 ]

0 голосов
/ 21 января 2019

попробуйте

Declare @startdate date ='1/1/2019'
Declare @Enddate date ='1/21/2019'

Select * from tablename where cast(creationdate as date) between @startdate and @Enddate
0 голосов
/ 21 января 2019

Напишите запрос как:

SELECT p.*
FROM profile p
WHERE p.creation_date >= 2019-01-21' AND
      p.creation_date < 2019-01-22' ;

Добавьте индекс на profile(creation_date), и запрос должен быть быстрым и масштабируемым (т.е. не замедляться заметно по мере роста числа строк).

0 голосов
/ 21 января 2019

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

Если вы используете столбец Datetime, который запускается после вставки профиля в вашу базу данных, у вас есть все, что вам нужно. Вам просто нужен столбец timezone, возможно, чтобы узнать часовой пояс созданного профиля.

Вы можете сделать что-то вроде этого:

// I have no idea how your column or table are named so here is an example
SELECT * FROM profile WHERE created_at = '?'

с ? датой, которую ищет ваш пользователь.

Теперь для локализованной части, вот документ: https://dev.mysql.com/doc/refman/8.0/en/date-and-time-functions.html#function_convert-tz

SELECT * FROM profile WHERE CONVERT_TZ(created_at, 'GMT', profile_timezone) = '?'

где 'GMT' - часовой пояс вашего сервера (замените реальным), а profile_timezone - часовой пояс профиля.

Таким образом, когда пользователь ищет профиль, вы возвращаете профиль в соответствии с датой и временем, когда он был создан в часовом поясе пользователя.

Это то, что вы ищете?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...