Как преобразовать Oracle «TIME» в JDBC Time в запросе?

#sql #oracle #date #jdbc #time

#sql #Oracle #Дата #jdbc #время

Вопрос:

Oracle не поддерживает тип данных TIME, но вы можете использовать DATE для хранения времени.

Моя проблема:

 select to_date('2009-06-30', 'YYYY-MM-DD') as "DATE",
       to_date('16:31:59', 'HH24:MI:SS') as "TIME"
from dual
  

выдает:

 DATE        TIME
2009-06-30  2009-08-01
  

когда я запускаю его через JDBC (фактически, в SQuirrel SQL). «2009-08-01» — не очень полезное время. В моем коде я могу использовать ResultSet.getTime() . Но как я могу получить время в общем запросе? Есть ли способ преобразовать результат?

Ответ №1:

У Oracle нет типа данных «Time». У него есть ДАТА, которая является датой и временем с точностью до секунды. Он также имеет временную метку с большей точностью.

Когда вы выполняете вызов to_date(), вы получаете обратно … ДАТУ! В зависимости от того, как у вас установлены настройки NLS, текст для этой даты может отображаться так, как вы хотите. Настройки NLS управляют такими вещами, как форматы даты, временные метки, символы валюты, десятичные разделители и т.д. Очевидно, что ваши настройки NLS определены для отображения данных даты в виде гггг-мм-дд.

Если вы пытаетесь использовать общие данные JDBC с Oracle DATEs, вам нужно указать «статическое» значение для части даты «день», а затем также указать время. Рассмотрим этот пример:

 String sql = "Select to_date('1970-01-01 ' || ? ,'YYYY-MM-DD HH24:MI:SS) as MY_TIME from dual";
Connection conn = null; //get Connection from somewhere
PreparedStatement stmt = conn.prepareStatement(sql);
stmt.setString(1, "16:31:59");
ResultSet rs = stmt.executeQuery();
rs.next(); //get to first element of result set;
java.sql.Time myTime = rs.getTime(1);
  

Результатом MyTime будет значение java.sql.Time, содержащее значение для 16:31:59. Не забудьте сохранить для части дня некоторое постоянное значение (например, 1970-01-01 выше), чтобы запросы со временем в предложении where работали должным образом.

Комментарии:

1. Спасибо. По какой-то причине я ожидал, что инженеры Oracle будут использовать постоянную часть дня, когда я указываю время только в TO_DATE().

Ответ №2:

Тип ДАТЫ сохраняется как дробное значение — дата как целочисленная часть, а время суток как дробная часть. Итак, у каждой ДАТЫ есть время, которое вы можете извлечь с помощью чего-то вроде этого.

 select TO_CHAR(sysdate, 'DD-MON-YYYY HH24:MI:SS') from dual;
  

Ответ №3:

Если я правильно понял, вы могли бы использовать строковое значение времени:

 select to_date('2009-06-30', 'YYYY-MM-DD') as "DATE",
       '16:31:59' as "TIME"
from dual;

String time_str =  ResultSet.getString("Time");
java.sql.Time jsqlT = java.sql.Time.valueOf( time_str);
  

это должно привести к нужному вам результату.