2015-04-02 2 views
1

Я пишу запрос как select * from tablename where date between '27-mar-2015' and '1-apr-2015'.Между не включенной датой окончания в oracle

но записи с датой '1-apr-2015' не получены из базы данных даты оракула TIMESTAMP(6).

+2

Ваша строка символов '1-апрелю-2015'' неявно преобразуется в метку времени с временем, установленным в' 00: 00: 00' поэтому любые строки остроумие h после полуночи на 2015-04-01 не будет включено. –

+0

есть ли решение для этого? – Jayakumar

+0

@a_horse_with_no_name вы уверены? Я бы поспорил, что неявное преобразование работает по-другому. дата преобразуется в строковое и строковое сравнение. – ibre5041

ответ

2

between '27-mar-2015' and '1-apr-2015'

'27 -mar-2015' НЕ ДАТА, это строковый литерал. Вы заставляете Oracle делать неявное преобразование типов данных.

date type is TIMESTAMP(6)

Поскольку ваш тип данных TIMESTAMP, вы должны заботиться о точности TIMESTAMP типа данных, который держит доли секунды с точностью от 0 до 9 знаков после запятой, по умолчанию является 6.

BETWEEN 
    to_timestamp('27-mar-2015 01.01.01.000001','dd-mon-yyyy HH24:MI:SS.FF') 
AND 
    to_timestamp('01-apr-2015 23.59.59.999999','dd-mon-yyyy HH24:MI:SS.FF') 

Например,

SQL> ALTER SESSION SET nls_timestamp_tz_format = 'DD-MON-YYYY HH24:MI:SS.FF'; 

Session altered. 

SQL> SELECT 
    2 to_timestamp('27-mar-2015 01.01.01.000001','dd-mon-yyyy HH24:MI:SS.FF') st, 
    3 to_timestamp('01-apr-2015 23.59.59.999999','dd-mon-yyyy HH24:MI:SS.FF') end 
    4 FROM dual 
    5/

ST         END 
---------------------------------- ---------------------------------- 
27-MAR-15 01.01.01.000001000 AM  01-APR-15 11.59.59.999999000 PM 

SQL> 
+0

Спасибо, Лалит! он отлично работает. – Jayakumar

+0

должен начинаться с «27-mar-2015 00.00.00.000000000» – Jayakumar

+0

Вы могли бы, но это сделает его «27-MAR-15 12.00.00.000000000 AM' –

1

Вы должны отметить, что timestamp -columns (и с оракулом даже date -columns) всегда включают в себя время суток, и что на самом деле означает date '1-apr-2015''1-apr-2015 00:00:00' - то все имеет смысл. Точное строковое представление временных меток может варьироваться в зависимости от настроенного языка.

Чтобы получить дату, включая первый апрель, лучше всего использовать between ... and '2-apr-2015', если вы не против первой микросекунды того дня.

+0

Столбцы - это timestamp' не 'date' - но ваш ответ по-прежнему верен –

+0

Я пробовал, что вы говорили, и получил следующую ошибку. «час должен быть от 1 до 12» – Jayakumar

+0

Спасибо @a_horse_with_no_name, я отредактировал свой ответ. –

0

Попробуйте преобразовать to_date:

select * from tablename 
where date between to_Date('27-mar-2015','dd-mm-yyy') 
and to_date('1-apr-2015','dd-mm-yyyy') 
+2

Не будет включать в себя '2015-04-01 00: 00: 01' –

+0

пробовал и получил следующую ошибку:« Ошибка SQL: ORA-01858: был найден нечисловой символ, где ожидалось число » – Jayakumar

+0

' to_Date (' 27-mar-2015 ',' dd-mm-yyy ') 'Формат отличается от месяца. Используйте «mon», а не 'mm'. Кстати, тип данных OP - это метка времени, а не дата. –

-1

Попробуйте использовать этот код:

select * from tablename where to_date(date,'DD-MON-YYYY') between '27-mar-2015' and '1-apr-2015'. 
+0

сдает следующую ошибку: «конец формата даты заканчивается перед преобразованием всей входной строки» – Jayakumar

+0

Я не сделал нисходящее решение, но подумал, чтобы объяснить. 'to_date (дата, 'DD-MON-YYYY')' преобразует дату в строку с локальным форматом NLS, а затем конвертируется обратно в DATE.Это неправильно, и его следует избегать. Вам нужно 'TO_DATE' преобразовать строку в дату. –

+0

Лалит, спасибо за вашу доброту. –

Смежные вопросы