Текущая дата в одинарных кавычках в Java - PullRequest
0 голосов
/ 03 июля 2018
static SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd- MMM-yyyy");
static String date = simpleDateFormat.format(new Date());

private static final String SELECT_BY_AUDIT_KEY_QUERY = "SELECT * FROM 
     t02 WHERE t02_create_date = " + date;

Это выводит как:

SELECT * FROM t02_transaction_log WHERE t02_create_date = 03-Jul-2018

Что я хочу, это:

SELECT * FROM t02_transaction_log WHERE t02_create_date = '03-Jul-2018'

Как мне добиться этого, получить дату между одинарными кавычками?

Ответы [ 3 ]

0 голосов
/ 03 июля 2018

Вы должны использовать готовое заявление здесь:

String sql = "SELECT * FROM t02 WHERE t02_create_date = ?";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setDate(1, new Date());
ResultSet rs = ps.executeQuery();
while (rs.next()) {
    // process result set
}

Хотя операторы важны для предотвращения таких вещей, как внедрение SQL, они одинаково полезны, поскольку они избавляют вас от необходимости беспокоиться о форматировании деталей в вашем запросе. В приведенной выше строке запроса мы просто представляем дату в виде заполнителя ? и позволяем драйверу обрабатывать маршалинг текущей даты в правильный формат для отправки в Oracle.

0 голосов
/ 04 июля 2018

ТЛ; др

получить дату между одинарными кавычками?

Не надо. Вы должны использовать умные объекты, а не тупые строки, чтобы обмениваться значениями дат с вашей базой данных.

Используйте java.time классы, которые заменили классы устаревших классов.

Для значений только по дате используйте LocalDate класс, который заменил java.sql.Date.

myPreparedStatement.setObject( 
    … , 
    LocalDate.of( 2018 , Month.JANUARY , 23 ) 
)

… и поиск…

myResultSet.getObject( 
    … ,
    LocalDate.class 
)

java.time

Ответ Тима Бигелайзена правильный, но использует старые проблемные классы. java.util.Date, java.sql.Date, SimpleDateFormat и связанные с ними старые классы даты и времени были вытеснены несколько лет назад классами java.time .

Начиная с JDBC 4.2 и более поздних версий, мы можем напрямую обмениваться объектами java.time с базой данных. Используйте PreparedStatement::setObject и ResultSet::getObject методы.

Дата только

Если столбец вашей базы данных имеет тип только для даты без времени суток и без часового пояса, аналогично стандартному типу SQL DATE, используйте класс LocalDate. Пример кода:

LocalDate localDate = LocalDate.of( 2018 , Month.JANUARY , 23 ) ;  // 2018-01-23.
String sql = "SELECT * FROM t02 WHERE t02_create_date = ? ;" ;  // Tip: Make a habit of closing your SQL properly with a semicolon. Won't hurt, and might help.
PreparedStatement ps = conn.prepareStatement( sql ) ;
ps.setObject( 1 , localDate );
ResultSet rs = ps.executeQuery();
while (rs.next()) {
    LocalDate ld = rs.getObject( 1 , LocalDate.class ) ;  // Retrieve an `LocalDate` class.
}

Дата-время

Если столбец вашей базы данных имеет тип «дата со временем», аналогичный стандарту TIMESTAMP WITH TIME ZONE стандарта SQL, используйте класс Instant. Пример кода:

LocalDate instant = LocalDate.of( 
String sql = "SELECT * FROM t02 WHERE t02_create_date = ? ;" ;  // Tip: Make a habit of closing your SQL properly with a semicolon. Won't hurt, and might help.
PreparedStatement ps = conn.prepareStatement( sql ) ;
ps.setObject( 1 , instant );
ResultSet rs = ps.executeQuery();
while (rs.next()) {
    Instant instantRetrieved = rs.getObject( 1 , Instant.class ) ;  // Retrieve an `Instant` class.
    // You may want to adjust from UTC to some other time zone.
    ZoneID z = ZoneId.of( "Africa/Tunis" ) ;
    ZonedDateTime zdt = instantRetrieved.atZone( z ) ;  // Same moment, same point on the timeline, different wall-clock time as seen by the people of some particular region (a time zone). 
}

О java.time

Фреймворк java.time встроен в Java 8 и более поздние версии. Эти классы заменяют проблемные старые устаревшие классы даты и времени, такие как java.util.Date, Calendar, & SimpleDateFormat.

Проект Joda-Time , теперь в режиме обслуживания , рекомендует выполнить переход на классы java.time .

Чтобы узнать больше, см. Oracle Tutorial . И поиск переполнения стека для многих примеров и объяснений. Спецификация JSR 310 .

Вы можете обмениваться java.time объектами напрямую с вашей базой данных. Используйте драйвер JDBC , совместимый с JDBC 4.2 или более поздней версии. Нет необходимости в строках, нет необходимости в java.sql.* классах.

Где получить классы java.time?

Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является полигоном для возможных будущих дополнений к java.time. Здесь вы можете найти несколько полезных классов, таких как Interval, YearWeek, YearQuarter и more .

0 голосов
/ 03 июля 2018

Попробуйте это

 private static final String SELECT_BY_AUDIT_KEY_QUERY = "SELECT * FROM 
     t02 WHERE t02_create_date = to_date('" + date + "', 'dd-mon-yyyy')";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...