как использовать = оператор присваивания со столбцом даты и времени в оракуле - PullRequest
2 голосов
/ 17 ноября 2009

Я использую метку времени в столбце dat таблицы r3. когда я запускаю команду

select dat from r3 where dat='16-nov-09';

показывает «не выделено ни одной строки», но когда я запускаю команду

select dat from r3 where dat>'15-nov-09';

показывает полные данные 16 ноября 2009 года. Скажите, что не так в моей первой команде или что я должен сделать.

Ответы [ 7 ]

6 голосов
/ 17 ноября 2009

Запросы по столбцам даты оракула всегда сбивают с толку. Тип столбца даты - это всегда дата и время. При сохранении текущей даты из sysdate всегда хранится компонент времени.

Есть добрые и злые способы опрашивать столбцы даты. Я показываю и голосую за некоторых.

where to_char(DAT, 'DD-MON-YYYY') = '16-NOV-2009'

where trunc(DAT) = to_date('16-NOV-2009', 'DD-MON-YYYY')

Оба плохие, потому что они не используют индекс. Чтобы избежать этого, вы можете определить индекс функции на основе выражения. Хитрость обоих заключается в том, чтобы отрезать временную составляющую. Если время не требуется, то рекомендуется сократить время в триггерах INSERT и UPDATE. Индекс на основе функций может преобразовываться в нормальный индекс.

where DAT between to_date('16-NOV-2009', 'DD-MON-YYYY') 
          and to_date('16-NOV-2009 23:59:59', 'DD-MON-YYYY HH24:MI:SS')

where DAT >= to_date('16-NOV-2009', 'DD-MON-YYYY') and DAT < to_date('16-NOV-2009', 'DD-MON-YYYY')+1

Эти два всегда мои любимые. Полезно использовать to_date и to_char для преобразования значений между строкой и датой и временем.

2 голосов
/ 17 ноября 2009

Поскольку DAT является меткой времени, вы можете использовать, как показано ниже

select DAT from R3 
where DAT between to_date('16-NOV-09' , 'dd-MON-yy') and to_date('16-NOV-09 23:59:59', 'DD-MON-YY hh24:mi:ss')
1 голос
/ 17 ноября 2009

TIMESTAMP и DATE - это разные типы данных в Oracle и оба хранят компоненты времени. Если вам действительно нужно хранить подсекундное время, используйте TIMESTAMP, иначе DATE - ваш лучший выбор.

Синтаксис меток времени и даты в формате ANSI довольно удобен:

create table ts_test (ts1 timestamp);

select *
from   ts_test
where  ts1 > timestamp '2009-10-11 00:00:00'
/

select *
from   ts_test
where  ts1 > timestamp '2009-10-11 00:00:00.1'
/

select *
from   ts_test
where  ts1 > timestamp '2009-10-11 00:00:00.001'
/

select *
from   ts_test
where  ts1 = date '2009-10-11'
/
1 голос
/ 17 ноября 2009

Отметка времени содержит компоненты времени и даты, поэтому запрос

select dat from r3 where dat='16-nov-09';

будет работать только для записей, где компонент времени - полночь: '00: 00: 00 '

Помимо форматирования (функция to_date) вы можете усечь метку времени, чтобы получить только дату:

select dat from r3 where trunc(dat)='16-nov-09';

Помните, что при этом не будет использоваться индекс в поле dat (если есть).

0 голосов
/ 03 января 2014

Просто добавьте к этому. Простой выход, когда вы не беспокоитесь о отметке времени, а просто хотите сравнить дату, - это использовать оператор like. например

select dat from r3 where dat LIKE '16-nov-09%'

даст вам желаемый результат.

0 голосов
/ 17 ноября 2009

В Oracle поля даты также содержат компонент времени, поэтому 16 ноября - фактически полночь 16 ноября.

Два разных способа справиться с этим:

where to_char(DAT,'mmddyyyy') = '11152009'

, как предложил Джон, но мне больше нравится следующая версия:

where trunc(dat) = to_date ('11152009', 'mmddyyyy')

TRUNC для даты «удаляет» компонент времени (или, если быть более точным, обрезает его до полуночи), а to_date является правильным способом для создания значения даты в Oracle SQL. (Я предпочитаю проводить сравнения в правильном домене - DATE, как во втором примере, а не в другом - STRING, как в первом примере. Со строками вы можете столкнуться с некоторыми странными проблемами месяца, сортировка по датам и т. Д. Проще) *

0 голосов
/ 17 ноября 2009

используйте приведенный ниже формат для поля даты, в котором условие.

where to_char(DAT,'mmddyyyy') = '11152009';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...