Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Сравнение дат в оракле  [new]
Roman35
Member

Откуда:
Сообщений: 60
ВОпрос наверное не новый однако подходящего ответа найти не удалось.
имеется таблица в которой существует поле REGDATE типа DATE

Пишу селект
select regdate  from  IC.cards crd
where crd.regdate>= to_date('30.08.2012','dd.mm.yyyy') 

Получаю набор значений
ОТ 30.08.2012 ПО 03.09.2012

Если делаю
select regdate  from  IC.cards crd
where crd.regdate= to_date('30.08.2012','dd.mm.yyyy') 

получаю пустой результат

Почему так? Как мне написать запрос ,который возвратит данные за конкретную дату?
3 сен 12, 13:29    [13105158]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение дат в оракле  [new]
Edward Shevtsov
Member

Откуда: Moscow
Сообщений: 13469
Roman35,

секунды проверяй
3 сен 12, 13:30    [13105179]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение дат в оракле  [new]
K790
Member

Откуда:
Сообщений: 633
Roman35,

с учетом часов, минут, секунд.
3 сен 12, 13:31    [13105192]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение дат в оракле  [new]
tru55
Member

Откуда: СПб
Сообщений: 19790
TRUNC( <date> ) позволить обрезать дату с точностью до дня, т.е. получить дату с нулевым временем
3 сен 12, 13:33    [13105210]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение дат в оракле  [new]
sectumsepra
Member

Откуда:
Сообщений: 6
Здесь значение crd.regdate в where берется с точностью до секунд, а искомая дата - с точностью до дня, поэтому во избежание вывода пустого результата рекомендую использовать такую конструкцию:

select regdate from IC.cards crd
where to_date(crd.regdate,'dd.mm.yyyy') = to_date('30.08.2012','dd.mm.yyyy')

Этот селект будет приводить и crd.regdate, и требуемую дату к единому формату.
3 сен 12, 14:06    [13105535]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение дат в оракле  [new]
_Alex_SMIRNOV_
Member

Откуда: Киев
Сообщений: 1519
sectumsepra
Здесь значение crd.regdate в where берется с точностью до секунд, а искомая дата - с точностью до дня, поэтому во избежание вывода пустого результата рекомендую использовать такую конструкцию:

select regdate from IC.cards crd
where to_date(crd.regdate,'dd.mm.yyyy') = to_date('30.08.2012','dd.mm.yyyy')

Этот селект будет приводить и crd.regdate, и требуемую дату к единому формату.



Тоесть о неявном преобразование вы никогда не слышали?
3 сен 12, 14:11    [13105582]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение дат в оракле  [new]
Вячеслав Любомудров
Member

Откуда: Владивосток
Сообщений: 18483
А так же выполнять дополнительное абсолютно ненужное преобразование для каждой строки и обламывать использование индекса по этому полю

В таком случае лучше between
3 сен 12, 14:12    [13105596]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение дат в оракле  [new]
sectumsepra
Member

Откуда:
Сообщений: 6
_Alex_SMIRNOV_,
оракл рекомендует использовать явные преобразования, и не зря.
Oracle recommends that you specify explicit conversions, rather than rely on implicit or automatic conversions.
3 сен 12, 14:26    [13105754]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение дат в оракле  [new]
Vint
Member

Откуда: Москва
Сообщений: 4564
sectumsepra,
умник, это у ТЕБЯ неявное преобразование к дате. только ты его в упор не видишь)
3 сен 12, 14:30    [13105823]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение дат в оракле  [new]
Roman35
Member

Откуда:
Сообщений: 60
tru55
TRUNC( <date> ) позволить обрезать дату с точностью до дня, т.е. получить дату с нулевым временем

Вот этот метод мне понравился более всего и Он работает.
where TRUNC(crd.regdate)= to_date('30.08.2012','dd.mm.yyyy') 

Я то думал что поле типа DATE есть число с номером дня, оказывается что это специальный 7-байтный формат. Данные дат хранятся в фиксированных полях длиной семь байт, соответствующих веку, году, месяцу, дню, часу, минуте и секунде.
Конвертировать перед сравнением поле в строку символов считаю не умным решением,поскольку возникают ненужные затраты времени на преобразование,а затем побайтное сравнение срок.
3 сен 12, 14:45    [13106048]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение дат в оракле  [new]
Edward Shevtsov
Member

Откуда: Moscow
Сообщений: 13469
sectumsepra
Здесь значение crd.regdate в where берется с точностью до секунд, а искомая дата - с точностью до дня, поэтому во избежание вывода пустого результата рекомендую использовать такую конструкцию:

select regdate from IC.cards crd
where to_date(crd.regdate,'dd.mm.yyyy') = to_date('30.08.2012','dd.mm.yyyy')

Этот селект будет приводить и crd.regdate, и требуемую дату к единому формату.
поле regdate типа DATE у ТС
3 сен 12, 14:45    [13106053]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение дат в оракле  [new]
SysOper
Member

Откуда: M
Сообщений: 9760
Roman35,

А по crd.regdate есть индекс?
3 сен 12, 14:47    [13106068]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение дат в оракле  [new]
Roman35
Member

Откуда:
Сообщений: 60
SysOper
Roman35,

А по crd.regdate есть индекс?

Инднкса нету,только ограничение "REGDATE" IS NOT NULL и автозаполнение поля TRUNC(SYSDATE)
3 сен 12, 15:00    [13106202]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение дат в оракле  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
Roman35
SysOper
Roman35,

А по crd.regdate есть индекс?

Инднкса нету,только ограничение "REGDATE" IS NOT NULL и автозаполнение поля TRUNC(SYSDATE)

ага, конечно.
а вот теперь проверьте своё
where ляля > trunc(ляля)
3 сен 12, 15:46    [13106541]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение дат в оракле  [new]
_Alex_SMIRNOV_
Member

Откуда: Киев
Сообщений: 1519
sectumsepra
_Alex_SMIRNOV_,
оракл рекомендует использовать явные преобразования, и не зря.
Oracle recommends that you specify explicit conversions, rather than rely on implicit or automatic conversions.


Это был сарказм ))
3 сен 12, 15:59    [13106673]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить