JDBC setDate не работает с подготовленным заявлением - PullRequest
0 голосов
/ 20 января 2012

Я довольно новичок в Java JDBC. Я пытаюсь создать подготовленное заявление JDBC для выполнения SELECT между двумя значениями Oracle DATE. Я знаю, что между этими двумя данными существуют данные, так как я могу выполнить запрос напрямую.

Когда я выполняю подготовленный оператор из своего кода JDBC, он возвращает 0 строк.

Мои начальные и временные значения ввода представляют собой значения времени Long Unix в миллисекундах.

Я попытался сократить код до минимума:

public static List<Oam1731Sam5Data> getData(Long startTime, Long endTime) {
    try {
        String query = "SELECT timecaptured from oam1731data5 " +
            "WHERE timecaptured between ? and ?";

        pstmt = conn.prepareStatement(query); // create a statement

        Date javaStartDate = new Date(startTime);
        Date javaEndDate = new Date(endTime);

        pstmt.setDate(1, javaStartDate);
        pstmt.setDate(2, javaEndDate);

        ResultSet rs = pstmt.executeQuery();

        while (rs.next()) {
            String serviceId =  rs.getString("SERVICEID");
            String recordSource = rs.getString("RECORDSOURCE");
            Date timeCaptured = rs.getDate("TIMECAPTURED");
            Long oneWayMaxDelay = rs.getLong("ONEWAYMAXDELAY");
            Long twoWayMaxDelay = rs.getLong("TWOWAYMAXDELAY");
            Long twoWayMaxDelayVar = rs.getLong("TWOWAYMAXDELAYVAR");
            Long packetLoss = rs.getLong("PACKETLOSS");
        }

    } catch (SQLException se) {
        System.err.println("ERROR: caught SQL exception, code: " + se.getErrorCode() + 
                ", message: " + se.getMessage());
    }

Проблема в том, что это возвращает 0 строк, где тот же запрос возвращает данные:

выберите insert_date, источник записи, serviceid, время захвата, onewaymaxdelay, twowaymaxdelay, twowaymaxdelayvar, потеря пакета из oam1731data5 где время отсчитывается между датой до (2012-01-18 07:00:00, YYYY-MM-DD HH24: MI: SS ') и to_date («2012-01-18 08:00:00», «ГГГГ-ММ-ДД ЧЧ24: MI: СС») упорядочить по дате вставки

DBMS_OUTPUT:


INSERT_DATE RECORDSOURCE SERVICEID TIMECAPTURED ONEWAYMAXDELAY TWOWAYMAXDELAY TWOWAYMAXDELAYVAR PACKETLOSS


1/18/2012 10:43:36 AM EV TAMP20-MTRO-NID1SYRC01-MTRO-NID1 18.01.2012 7:25:24 40822 79693 343 0
18.01.2012 10:43:36 EV SYRC01-MTRO-NID1TAMP20-MTRO-NID1 18.01.2012 7:25:13 39642 79720 334 0
18.01.2012 10:43:36 EV TAMP20-MTRO-NID1SYRC01-MTRO-NID1 18.01.2012

Я видел и готов много постов о проблемах, подобных этому, но не был смог найти ключ еще!

Я думал о том, чтобы попытаться заставить мой запрос использовать строку и просто преобразовать мои даты в строки, чтобы можно было вставить их для функции Oracle TO_DATE, но, похоже, я не должен был это делать.

А вот вывод из моих операторов println. Является ли проблемой то, что печатаемые даты НЕ показывают часть времени?

SQL-запрос: ВЫБРАТЬ время, захваченное из oam1731data5, ГДЕ время между? а также ? Java Oracle дата: 2012-01-18 дата окончания 2012-01-18

Заранее спасибо за любую помощь.

Митч

Ответы [ 2 ]

0 голосов
/ 20 января 2012

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

0 голосов
/ 20 января 2012

A java.sql.Date представляет дату без времени.Вы должны использовать метку времени, если вам небезразлична часть времени.

В javadoc of java.sql.Date написано:

Чтобы соответствовать определениюSQL DATE, значения миллисекунд, обернутые экземпляром java.sql.Date, должны быть «нормализованы» путем установки часов, минут, секунд и миллисекунд на ноль в определенном часовом поясе, с которым связан экземпляр.

...