У меня есть следующее веб-приложение: пользователи могут вводить шаблоны формата даты в формате java и дату (конечно, соответствующие шаблону формата даты java), и я хочу сохранить эту дату в базе данных оракула.
Поэтому мне нужно перевести шаблон формата даты java простой в шаблон оракула. Например:
и так далее.
Вместо следующего кода, имеющего только один SimpleDateFormat, я хотел бы иметь все или, по крайней мере, большую группу SimpleDateFormatPatterns, переведенную в шаблон Oracle:
SimpleDateFormat sFormat = new SimpleDateFormat( "dd-MM-yyyy HH:mm:ss");
String sqlSnippet = "TO_DATE('" + sFormat.format(date) + "','DD-MM-YYYY HH24:MI:SS')";
Есть ли библиотека или, возможно, только список отображения, чтобы сделать это?
Благодарю.
Изменение: мне нужно построить SQL вручную, поскольку пользователь определяет критерии, сравнивает операторы и соединения в пользовательском интерфейсе. В конце концов, у меня есть что-то вроде этого
AND col2 > TO_DATE('26-09-2012','DD-MM-YYYY')
Поэтому мне нужно перевести шаблон формата даты java простой в шаблон оракула
Нет, нет. Вместо этого вы должны использовать PreparedStatement
и называть setDate
или setTimestamp
на нем, чтобы указать интересующее вас значение.
Избегайте преобразований строк, если они не являются частью части того, что вы пытаетесь сделать (например, отображение даты/времени в пользовательском интерфейсе). Для простой передачи информации из вашего приложения в вашу базу данных или наоборот, вы должны сократить количество необходимых преобразований, насколько это возможно.
Ответ Джона Скита правильный, но теперь он устарел, ссылаясь на некоторые классы наследия. java.sql.Date
и java.sql.Timestamp
и связанные классы теперь вытесняются классами LocalDate
, LocalDate
и Instant
соответственно. Но ваш вопрос требует класс LocalDateTime
.
Вы возражаете против представления значений даты и времени. Начиная с JDBC 4.2 и более поздних версий, вы можете напрямую обменивать java.time-объекты с вашей базой данных.
На ваших входах нет индикатора часового пояса или смещения от-UTC. Итак, проанализируйте Java как LocalDateTime
для хранения в столбце типа, аналогичного SQL-стандарту TIMESTAMP WITHOUT TIME ZONE
.
DateTimeFormatter f1 = DateTimeFormatter.ofPattern( "dd-MM-uuuu HH:mm:ss" ) ;
DateTimeFormatter f2 = DateTimeFormatter.ofPattern( "dd-MM-uu HH:mm:ss" ) ;
DateTimeFormatter f3 = DateTimeFormatter.ofPattern( "dd-MM-uu HH:mm" ) ;
Выберите форматтер по длине входной строки.
LocalDateTime ldt = LocalDateTime.parse( myInputString , f2 ) ;
Мне нужно создать SQL вручную, поскольку пользователь определяет критерии, сравнивает операторы и объединения в пользовательском интерфейсе. В конце концов, у меня есть что-то вроде этого
Строка sqlSnippet = "TO_DATE ('" + sFormat.format(date) + "', 'DD-MM-YYYY HH24: MI: SS')";
Нет, не вставляйте свое значение даты в текст в строку SQL. Вместо этого используйте PreparedStatement
?
заполнители заменены на ваш объект LocalDateTime
.
String sql = "SELECT when FROM tbl WHERE when > ? ;" ;
Передайте объект, который нужно поместить в этот заполнитель во время выполнения.
myPreparedStatement.setObject( … , ldt ) ;
индексирование:
LocalDateTime ldt = myResultSet.getObject( … ; LocalDateTime.class ) ;
Рамка java.time встроена в Java 8 и более поздние версии. Эти классы вытесняют неприятные старые устаревшие классы времени, такие как java.util.Date
, Calendar
и SimpleDateFormat
.
Проект Joda-Time, теперь в режиме обслуживания, советует перейти на классы java.time.
Чтобы узнать больше, ознакомьтесь с учебным пособием Oracle. И поиск Qaru для многих примеров и объяснений. Спецификация - JSR 310.
Вы можете обменивать объекты java.time непосредственно с вашей базой данных. Используйте JDBC-драйвер, совместимый с JDBC 4.2 или новее. Нет необходимости в строках, нет необходимости в java.sql.*
.
Где можно получить классы java.time?
Проект ThreeTen-Extra расширяет java.time с дополнительными классами. Этот проект является доказательством возможных будущих дополнений к java.time. Здесь вы можете найти полезные классы, такие как Interval
, YearWeek
, YearQuarter
и другие.
PreparedStatement.setDate
и т. Д.