tulasiram3975 Ответов: 5

Запрос для получения данных между двумя датами в (тип-varchar, формат-dd/mm/yyyy) mysql


Всем привет...
у меня есть один такой стол
нет даты
1 13/11/2011
2 14/11/2011
3 17/11/2011
4 02/12/2011
5 05/12/2011
и я написал один запрос типа
выберите * из tablname, где дата между '13/11/2011' и '17/11/2011'
он возвращается
нет даты
1 13/11/2011
2 14/11/2011
3 17/11/2011
когда я использовал этот запрос
выберите * из tablname, где дата между '13/11/2011' и '05/12/2011'
он не вернет никакого значения
потому что дата хранится в varchar, а формат - dd/mm/yyyy, и она берет и сравнивает с первыми двумя значениями
СУ как я могу получить значения между двумя датами
Пожалуйста, кто-нибудь может мне помочь
заранее спасибо

5 Ответов

Рейтинг:
40

OriginalGriff

Это действительно непросто: вы не должны хранить даты в строковых полях, потому что это усложняет эту проблему.
SQL-даты всегда yyyy-MM-dd, а не dd/MM/yyyy, поэтому вы даже не можете сначала преобразовать их в тип даты, не используя несколько функций подстроки и много удачи.

Серьезно: измените свою базу данных. Храните свои даты в полях дат, и вы можете манипулировать ими как внутри базы данных, так и снаружи гораздо проще и гораздо гибче: например, вам не нужно беспокоиться о локали пользователя и его формате даты!

"Сэр,
Можете ли вы дать пример запроса для приведенной выше таблицы, чтобы я мог продолжить, я пробовал много способов, но не получаю"


Это не сложно: попробуйте это, чтобы дать вам ключ:

SELECT CAST((SUBSTRING(Date, 7, 4) + '-' + SUBSTRING(Date, 4, 2) + '-' + SUBSTRING(Date, 1, 2)) AS Date) AS d FROM myTable


Серьезно: избавьте себя от многих будущих неприятностей, преобразовав свою базу данных в дату или время!


tulasiram3975

Проблема в том что я уже разработал свое программное обеспечение я не хочу меняться если изменения происходят это берет на себя большой риск для меня преобразование типа может решить проблему я знаю но мне нужно обойтись без изменений

OriginalGriff

Если вы не можете изменить базу данных (а я все еще настоятельно рекомендую это сделать), то вам придется разорвать данные на части и собрать их заново как часть вашего оператора SQL SELECT: возможно, Вам будет проще сделать это как хранимую процедуру.
Принцип будет таков: используйте подстроку три раза на каждую дату, чтобы разбить ее на день, месяц и год. Затем используйте функции CONVERT или CAST, чтобы преобразовать его в полезную дату для сравнения. Если вы сделаете это в своем выборе, вам, возможно, придется сделать это дважды: один раз для нижнего диапазона дат и один раз для верхнего.
Это нетрудно, но утомительно и немного утомительно. Я бы посоветовал вам попробовать войти в любое приложение, которое вы используете для администратора базы данных, прежде чем передавать его во внешнюю программу и оператор SELECT там - вы должны получить лучшую и более быструю диагностику.

tulasiram3975

Это невозможно ...

OriginalGriff

Да, это возможно.
Попробуй, и увидишь.

tulasiram3975

Сэр,
Можете ли вы дать пример запроса для приведенной выше таблицы, чтобы я мог продолжить, я пробовал много способов, но не получаю

OriginalGriff

Ответ Обновлен

tulasiram3975

Сэр на самом деле мне нужно между датами, я думаю, что он преобразует дату в гггг-ММ-ДД в этом формате и возвращает все даты как гггг-ММ-ДД. Но Как Вернуться Между Датами

OriginalGriff

Да. Я знаю. И когда я сказал "дать вам ключ", что, по-вашему, я имел в виду?
Вы должны сделать что-то из этого для себя.
Sql, который я вам дал, преобразует вашу текстовую дату в переменную SQL date.
Если бы вы использовали это в предложении WHERE, как вы думаете, что бы произошло?
Что произойдет, если вы используете это дважды в предложении WHERE?
Ради всего святого, неужели я должен подавать его тебе на тарелочке?

tulasiram3975

нет-нет...
хорошо я сделаю что нибудь спасибо у меня есть кое какая идея

BobJanova

Это изменение предотвратит много подобных гадостей в будущем. Если это ваше программное обеспечение, а не какая-то сторонняя вещь, к которой у вас нет доступа, вы должны пройти через небольшое количество боли сейчас, чтобы исправить это. И помните об этом, чтобы в следующий раз, когда вы создадите базу данных, вы не совершили ту же ошибку!

tulasiram3975

В Следующий Раз Я Не Буду Делать Эту Ошибку, Но Это База Данных Стороннего Приложения Уже Установлена В Клиентской Системе, Поэтому Я Не Меняю Тип.

saxenaabhi6

Вот почему я предложил вам сделать представление с пользовательским вычисляемым столбцом правильной даты и запросом к нему.

OriginalGriff

Не совсем то, что он просил: вы можете сделать только вид на данные, которые были получены. Если в вашей БД много записей, а вас интересуют только десять, то это чертовски пустая трата времени!

Рейтинг:
2

Ashishmau

Прежде всего, почему вы храните даты в виде строки в базе данных..никогда этого не делайте
Чтобы решить проблему ur, вам нужно сначала преобразовать ur date в datetime в базе данных, а затем сравнить как

convert(datetime,'12/11/2008')


Рейтинг:
1

saxenaabhi6

Я не знаю, вы создали столбец для хранения даты в varchar

во всяком случае, если вы это сделали
Я бы пошел на создание представления из вашей таблицы с дополнительным столбцом, который преобразует ваши даты varchar в правильно проанализированные даты.

Тогда я бы сделал все свои запросы к этому представлению. это сделает вашу жизнь проще в долгосрочной перспективе.


Рейтинг:
0

Ra-one

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

Если у вас есть лучшее решение, то не идите на какую-то ошибку.

В .net вы просто меняете все ссылки и вызов базы данных, а также меняете запросы, вот и все.

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

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

Так что не бойтесь вносить изменения в базу данных для varchar в datetime datatype.

Просто сделай это....Создайте идеальное программное обеспечение ;)


tulasiram3975

Спасибо За Предложение...

Рейтинг:
0

sunnychadha0548

выберите * из имени таблицы, где дата находится между форматом ('13/12/2012','ДД / ММ/гггг') и форматом ('17/12/2012','ДД/ММ/гггг');