Я пишу запрос как select * from tablename where date between '27-mar-2015' and '1-apr-2015'
.Между не включенной датой окончания в oracle
но записи с датой '1-apr-2015'
не получены из базы данных даты оракула TIMESTAMP(6)
.
Я пишу запрос как select * from tablename where date between '27-mar-2015' and '1-apr-2015'
.Между не включенной датой окончания в oracle
но записи с датой '1-apr-2015'
не получены из базы данных даты оракула TIMESTAMP(6)
.
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>
Вы должны отметить, что timestamp
-columns (и с оракулом даже date
-columns) всегда включают в себя время суток, и что на самом деле означает date '1-apr-2015'
'1-apr-2015 00:00:00'
- то все имеет смысл. Точное строковое представление временных меток может варьироваться в зависимости от настроенного языка.
Чтобы получить дату, включая первый апрель, лучше всего использовать between ... and '2-apr-2015'
, если вы не против первой микросекунды того дня.
Столбцы - это timestamp' не 'date' - но ваш ответ по-прежнему верен –
Я пробовал, что вы говорили, и получил следующую ошибку. «час должен быть от 1 до 12» – Jayakumar
Спасибо @a_horse_with_no_name, я отредактировал свой ответ. –
Попробуйте преобразовать 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')
Не будет включать в себя '2015-04-01 00: 00: 01' –
пробовал и получил следующую ошибку:« Ошибка SQL: ORA-01858: был найден нечисловой символ, где ожидалось число » – Jayakumar
' to_Date (' 27-mar-2015 ',' dd-mm-yyy ') 'Формат отличается от месяца. Используйте «mon», а не 'mm'. Кстати, тип данных OP - это метка времени, а не дата. –
Попробуйте использовать этот код:
select * from tablename where to_date(date,'DD-MON-YYYY') between '27-mar-2015' and '1-apr-2015'.
сдает следующую ошибку: «конец формата даты заканчивается перед преобразованием всей входной строки» – Jayakumar
Я не сделал нисходящее решение, но подумал, чтобы объяснить. 'to_date (дата, 'DD-MON-YYYY')' преобразует дату в строку с локальным форматом NLS, а затем конвертируется обратно в DATE.Это неправильно, и его следует избегать. Вам нужно 'TO_DATE' преобразовать строку в дату. –
Лалит, спасибо за вашу доброту. –
Ваша строка символов '1-апрелю-2015'' неявно преобразуется в метку времени с временем, установленным в' 00: 00: 00' поэтому любые строки остроумие h после полуночи на 2015-04-01 не будет включено. –
есть ли решение для этого? – Jayakumar
@a_horse_with_no_name вы уверены? Я бы поспорил, что неявное преобразование работает по-другому. дата преобразуется в строковое и строковое сравнение. – ibre5041