Oracle SQL-запрос для формата даты
Я всегда путаюсь с форматом даты в запросе ORACLE SQL и трачу минуты вместе с Google, может ли кто-нибудь объяснить мне самый простой способ решить, когда у нас есть другой формат даты в таблице базы данных?
например, у меня есть столбец даты как ES_DATE, содержит данные как 27-APR-12 11.52.48.294030000 AM типа данных TIMESTAMP (6) с зоной локального времени.
![enter image description here]()
Я написал простой запрос выбора для получения данных за этот конкретный день, и он ничего мне не возвращает. Может кто-нибудь объяснить мне?
select * from table
where es_date=TO_DATE('27-APR-12','dd-MON-yy')
или
select * from table where es_date = '27-APR-12';
Ответы
Ответ 1
to_date()
возвращает дату в 00:00:00, поэтому вам нужно "удалить" минуты с даты, по которой вы сравниваете:
select *
from table
where trunc(es_date) = TO_DATE('27-APR-12','dd-MON-yy')
Вероятно, вы хотите создать индекс на trunc(es_date)
, если это то, что вы делаете на регулярной основе.
Литерал '27-APR-12'
может сбой очень легко, если формат даты по умолчанию изменен на любой другой. Поэтому убедитесь, что вы всегда используете to_date()
с соответствующей маской формата (или литералом ANSI: date '2012-04-27'
)
Хотя вы правильно использовали to_date()
и не полагались на преобразование типов данных implict, использование to_date() все еще имеет тонкую ловушку из-за формата 'dd-MON-yy'
.
С другой настройкой языка это может легко провалиться, например. TO_DATE('27-MAY-12','dd-MON-yy')
, когда NLS_LANG установлен в немецкий. Избегайте ничего в формате, который может отличаться на другом языке. Использование четырехзначного года и только числа, например. 'dd-mm-yyyy'
или 'yyyy-mm-dd'
Ответ 2
если вы используете тот же формат даты и имеете запрос выбора, где дата в oracle:
select count(id) from Table_name where TO_DATE(Column_date)='07-OCT-2015';
To_DATE, предоставленный oracle
Ответ 3
Почему вы передаете дату как строку?
Я предлагаю вам использовать что-то вроде
Date myDate = new SimpleDateFormat("dd-MM-yy").parse("27-04-12");
java.sql.Date mySqlDate = new java.sql.Date(myDate.getTime());
И затем измените свой запрос, чтобы использовать PreparedStatement
вместо
Connection conn = // get connection to db somehow
PreparedStatement pst = conn.prepareStatement("select * from table
where es_date = ?")
pst.setDate(1, mySqlDate);
ResultSet rs = pst.executeQuery();
При этом вам не нужно запоминать конкретные для базы данных форматы для дат.