Селект даты

Работа VB и СУБД (Access, MSSQL, MySQL, Oracle и пр.)
Правила форума
При создании новой темы не забывайте указывать используемую СУБД.
sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Селект даты

Сообщение sergey-911 » 30.06.2005 (Чт) 22:54

Доброго времени суток уважаемые!
Сильно извиняюсь за ламерский вопрос, наболело...
Разъясните мне, почему при селекте данных типа "дата" нельзя применить ключевое слово like (like '%2005.30.06'), а нужно указывать = (= '2005.30.06') или between (between '2005.29.06' and '2005.30.06'). Разъясните, с точки зрения теории. :D
С уважением, Сергей.

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 30.06.2005 (Чт) 23:57

В зависимости от типа базы данных, существуют нужные тебе функции.

В Access это Date()
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

blinow
Обычный пользователь
Обычный пользователь
 
Сообщения: 53
Зарегистрирован: 27.06.2005 (Пн) 3:13

Сообщение blinow » 01.07.2005 (Пт) 2:56

Тип данных Date очень "мудреный", формат хранения в БД может быть разным и за обработку таких запросов отвечает сама БД.
Даже нормальное выражение запроса типа >='2005-12-23' не всегда по нужному может обрабатываться. Меньше всего проблем с Microsoft БД, а вот другие производители могут неожиданно подкачать. Например если формируешь строку запроса в приложении и выполняешь Conn.execute "Select * From Tralyly Where mDate >='2005-04-05' то все нормально, но если то же офрмить в виде хранимой процедуры и критерий выбора даты представить с типом Date, то ничего неполучишь из Window, необходимо выдать команду привидения формата даты к Windowой, тогда все отработает.
В Access необходимо подставлять критерий в виде #12.03.2005#, ну и т.д.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 02.07.2005 (Сб) 12:23

Чтобы не было нестыковок с датой, рекомендуется использовать формат #mm/dd/yyyy# либо #yyyy/mm/dd#.
Lasciate ogni speranza, voi ch'entrate.

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Сообщение sergey-911 » 02.07.2005 (Сб) 12:56

Всем привет и всем спасибо!:)
Не то! БД - MSSQL. Дату передаю, форматируя, как yyyymmdd - внутренний формат сервера MSSQL, его понимают все серваки, без исклбчения, с любыми временными настройками. С Access - немного проще.
Теперь вся суть вопроса. По привычке написал запрос SELECT * FROM [DBO].[EMPLOYEE] WHERE [DBO].[EMPLOYEE].[POLE_DATA] LIKE '20050602', естественно - обломался, пока не написал SELECT * FROM [DBO].[EMPLOYEE] WHERE [DBO].[EMPLOYEE].[POLE_DATA] = '20050602'. Меня интересовало, почему LIKE не работает в селекте, применимом к дате. Почему нельзя написать "SELECT * FROM [DBO].[EMPLOYEE] WHERE [DBO].[EMPLOYEE].[POLE_DATA] LIKE '20050602'[\b]" или "[b]SELECT * FROM [DBO].[EMPLOYEE] WHERE [DBO].[EMPLOYEE].[POLE_DATA] LIKE '%200506__%'":(
С уважением, Сергей.

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Сообщение sergey-911 » 02.07.2005 (Сб) 13:02

Прошу прощения, напутал с тегами, должно быть так было (точнее - не должно так быть): :(
"SELECT * FROM [DBO].[EMPLOYEE] WHERE [DBO].[EMPLOYEE].[POLE_DATA] LIKE '20050602'" или "SELECT * FROM [DBO].[EMPLOYEE] WHERE [DBO].[EMPLOYEE].[POLE_DATA] LIKE '%200506__%' :)
С уважением, Сергей.

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 03.07.2005 (Вс) 1:12

LIKE работает только со строками (char / varchar); со всеми остальными типами данных тебе придется использовать либо BETWEEN, либо пару сравнений больше/меньше (в первом случае берется включительный диапазон, а это не всегда допустимо). В случае даты есть еще несколько извращений, например, твой последний запрос можно написать так:
Код: Выделить всё
select * from employee
where Year(date_field) = 2005
  and Month(date_field) = 6
А можно так:
Код: Выделить всё
select * from employee
where (date_field between '20050601' and dateadd(mm, 1, '20050601'))

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

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Сообщение sergey-911 » 03.07.2005 (Вс) 13:48

Ennor Спасибо тебе огромное, выручил!:)
С уважением, Сергей.


Вернуться в Базы данных

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

    TopList