Hello Infobekcons Ответов: 2

Получение данных по месяцам и датам из базы данных


ПРИВЕТ,

У меня есть таблица фиксированных дат с from_date и to_date, я хочу получить данные
между двумя датами через
%m %d
и мой формат даты поиска-ММ-ДД. Я перепробовал много вещей, но никакого решения не было.

Это мой вопрос

"выберите id из monthly_tool, где "from_date" > 12-22 и "to_date" < 01-09 "

но он показывает мне 0 результат

моя структура таблицы - %m %d
from_date	to_date	
12-21 	   01-19 	
01-20 	   02-18
....




Как я могу искать из таблицы с %m %d между двумя столбцами

Спасибо

Что я уже пробовал:

I also tried to change column date format to %m %d. but no solution

Jörgen Andersson

Что это за база данных?

Hello Infobekcons

в MySQL

2 Ответов

Рейтинг:
2

Maciej Los

[РЕДАКТИРОВАТЬ]
Согласно обновленному вопросу:

Ваш дизайн базы данных неверен! Вам нужно использовать тип данных date вместо string , потому что ни одна база данных не может сравнивать строку с помощью [>] и [<] операторы!
Видеть: MySQL :: MySQL 8.0 справочное руководство :: 12.3.2 функции и операторы сравнения[^]

Представьте себе, каков будет результат приведенного ниже сравнения:

"Andrew" > "Jane" AND "Mike" < "Anna"

Нет, из-за того, что строки не сопоставимы таким образом.

Обратите внимание, что вы можете написать пользовательскую функцию, которая получает две переменные типа string в формате: "MM-dd- и разобрать его на набор чисел. Для "12-21- он должен вернуться. {12, 21}. Затем вы должны добавить часть года для создания даты. Но(!) это решение в высшей степени неэффективно.

Итак, окончательный вывод таков: используйте правильный тип данных - дата!


Hello Infobekcons

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

Maciej Los

Итак, ваш дизайн базы данных неверен! Вам нужно использовать тип данных date вместо string (где он является частью date).
Ни одна база данных не может сравнить строку с помощью > и < операторы!
Видеть: MySQL :: MySQL 8.0 справочное руководство :: 12.3.2 функции и операторы сравнения[^]

Hello Infobekcons

Спасибо за ваш ответ, я уже обновил формат даты столбцов my from_date и to_date. Используя это https://stackoverflow.com/questions/22827579/change-the-date-format-in-phpmyadmin вы можете проверить здесь. Теперь мой формат даты столбца таблицы
%m %d

Richard Deeming

Это не ясно из страницы, на которую вы ссылаетесь, но я только что попробовал в SQL Server, и вполне возможно сравнить строки с помощью < и > операторы. Они выполняют стандартные сравнения строк, сравнивая каждый символ по очереди, в зависимости от применимой сортировки.

Это определенно не то, что нужно делать на свиданиях. Но также неверно говорить, что струны нельзя сравнивать таким образом.

Maciej Los

Ричард, я не говорю, что сравнение строк с помощью операторов меньше-чем и больше-чем вообще невозможно...

Я бы частично согласился с вашим мнением, если бы ОП спрашивал о sql server, но он/она указывает на сервер базы данных MySQL. Хотя MySQL-это разоблачение STRCMP() функция, но такое сравнение не отвечает потребностям ОП...
Видеть: MySQL :: MySQL 8.0 справочное руководство :: 12.7.1 функции и операторы сравнения строк[^]

Я говорю о конкретном поставщике баз данных...

Рейтинг:
0

CHill60

Привет Infobekcons написал:
Я также попытался изменить формат даты столбца на %m %d. но решения нет
Это невозможно. Столбцы дат не имеют "формата".

Смотрите комментарии от @maciej-los - вы должны хранить данные в своей таблице следующим образом date Не varchar типы. Вы все еще можете искать по месяцам и годам, если хотите
select id from monthly_tool where MONTH(from_date) >= 12 AND YEAR(from_date) >= 22 and MONTH(to_date) <= 1 AND YEAR(to_date) <= 9
Но это не очень приятно. Лучше было бы преобразовать параметры поиска в даты например
declare @search_from varchar(5) = '12-22'
declare @search_to varchar(5) = '01-18'
declare @date_from date = cast('01-' + @search_from AS date)
declare @date_to date = LASTDAY(cast('01-' + @search_to AS date))
select id from monthly_tool where from_date >= @date_from_date and to_date <= @date_to_date

[Необходимо отметить, что ваши даты "от" находятся после ваших дат "до" в ваших "образцовых данных"]

Если вы настаиваете на неправильном хранении ваших данных, то, по крайней мере, храните символы таким образом, чтобы их можно было легко найти, например
declare @monthly_tool table(id int identity(1,1), from_date varchar(5), to_date varchar(5))
insert into @monthly_tool (from_date, to_date) values
('2112','1901'),
('2001','1802')

declare @search_from varchar(5) = '2212'
declare @search_to varchar(5) = '1801'

select id from @monthly_tool where CAST(from_date as int) >= CAST(@search_from as int) and CAST(to_date as int) <= CAST(@search_to as date)
Но лучший совет, который вы получите от всех нас сегодня, - это хранить ваши данные в соответствующих типах столбцов, а наиболее подходящим типом столбцов для даты является date!


Hello Infobekcons

@CHill60 спасибо за ваш ответ, остро этот процесс int не будет работать, потому что я ищу дату мудро, означает, что с 22 декабря ( 22-12 ) по 9 января (01-09) мне нужна та строка, которая имеет эти связанные детали, такие как 22 декабря и 9 января, подходит под мой первый результат строки.
Мне нужен диапазон дат От До До, поэтому я изменил тип даты на %M %D