#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);
это должно привести к нужному вам результату.