простой шаблон даты java для шаблона даты оракула sql

1

У меня есть следующее веб-приложение: пользователи могут вводить шаблоны формата даты в формате java и дату (конечно, соответствующие шаблону формата даты java), и я хочу сохранить эту дату в базе данных оракула.

Поэтому мне нужно перевести шаблон формата даты java простой в шаблон оракула. Например:

  • "dd-MM-yyyy HH: mm: ss" в "DD-MM-YYYY HH24: MI: SS"
  • "dd-MM-yy HH: mm: ss" в "DD-MM-YY HH24: MI: SS"
  • "dd-MM-yy HH: mm" в "DD-MM-YY HH24: MI"

и так далее.

Вместо следующего кода, имеющего только один 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')
Теги:
date

2 ответа

3

Поэтому мне нужно перевести шаблон формата даты java простой в шаблон оракула

Нет, нет. Вместо этого вы должны использовать PreparedStatement и называть setDate или setTimestamp на нем, чтобы указать интересующее вас значение.

Избегайте преобразований строк, если они не являются частью части того, что вы пытаетесь сделать (например, отображение даты/времени в пользовательском интерфейсе). Для простой передачи информации из вашего приложения в вашу базу данных или наоборот, вы должны сократить количество необходимых преобразований, насколько это возможно.

  • 0
    Спасибо за быстрый ответ, но мне нужно создать это заявление SQL вручную. Пользователь может определить критерии для предложения WHERE в пользовательском интерфейсе (также соединения и другие элементы), а также операторы сравнения. Может быть, я могу использовать внутренний API setDate.
  • 1
    То, что вам нужно динамически создавать некоторые из SQL, не означает, что вы должны делать все динамически. Я настоятельно, настоятельно, настоятельно призываю вас не делать этого. Указание значений непосредственно в SQL чревато опасностью. Вы по-прежнему можете создавать SQL динамически, но включить туда спецификаторы параметров и использовать PreparedStatement.setDate и т. Д.
Показать ещё 3 комментария
0

Ответ Джона Скита правильный, но теперь он устарел, ссылаясь на некоторые классы наследия. 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.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?

  • Java SE 8, Java SE 9 и более поздние версии
    • Встроенный.
    • Часть стандартного Java API с интегрированной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и Java SE 7
    • Большая часть функциональных возможностей java.time включена обратно в Java 6 и 7 в ThreeTen-Backport.
  • Android
    • Более поздние версии реализаций пакетов Android классов java.time.
    • Для более ранних Android (<26), то ThreeTenABP проект адаптирует ThreeTen-Backport (упоминалось выше). См. Раздел Как использовать ThreeTenABP....

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню