有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

带有时间戳的java“select”preparedStatement返回始终为空的记录集

我尝试使用JDBC瘦驱动程序从ORACLE数据库表中检索记录。 我使用的准备好的声明: (一)

SELECT (t1.LOGGED_TIME - ?) AS TDIFF, t1.ID, t1.STATUS, t1.LOGGED_TIME, t1.SERVER_TIME 
        FROM table_1 t1 
        WHERE (
          ((t1.LOGGED_TIME - ?) <= INTERVAL '10' DAY) 
          AND ((t1.LOGGED_TIME - ?) >= INTERVAL '-10' DAY)) 
        ORDER BY t1.LOGGED_TIME DESC

其中t1。LOGGED_TIME表示时间戳列。每三个参数都是相同的时间戳

java.sql.Timestamp controlTime = Timestamp.valueOf("2014-08-15 03:52:00");

lookupTime.setTimestamp(1, controlTime);
lookupTime.setTimestamp(2, controlTime);
lookupTime.setTimestamp(3, controlTime);

执行代码工作正常-不显示异常或警告。然而,返回的结果集

rs =  lookupTime.executeQuery();

是空的

将查询设置为 (二)

SELECT (t1.LOGGED_TIME - TO_TIMESTAMP('2014-08-15 03:52', 'yyyy-mm-dd hh24:mi')) AS TDIFF, t1.ID, t1.STATUS, t1.LOGGED_TIME, t1.SERVER_TIME 
FROM table_1 t1 
WHERE (
  ((t1.LOGGED_TIME - TO_TIMESTAMP('2014-08-15 03:52', 'yyyy-mm-dd hh24:mi')) <= INTERVAL '10' DAY) 
  AND ((t1.LOGGED_TIME - TO_TIMESTAMP('2014-08-15 03:52', 'yyyy-mm-dd hh24:mi')) >= INTERVAL '-10' DAY)) 
ORDER BY t1.LOGGED_TIME DESC

返回预期的数据。 当我用一个准备好的语句从同一个表的另一列中查询字符串时,结果是ok的

我错过了什么?重点在哪里?有什么想法吗

说得很清楚:重点不是在(2)中识别一种错误的日期/时间格式转换。这将始终导致oracle错误消息,并且很容易修复

问题是:为什么preparedStatement(1)返回的记录集保持为空(=不是一条记录),而没有任何错误通知?如果时间戳格式有任何错误,为什么没有错误或警告


共 (1) 个答案

  1. # 1 楼答案

    检查TO_TIMESTAMP格式:

    TO_TIMESTAMP('2014-08-15 03:52',
                   'dd.mm.yy hh24:mi')
    

    Aug. 14, 2015,而不是Aug. 15, 2014

    更新

    事实上,我在尝试该方法时出现以下错误:

    ORA-01843: not a valid month
    01843. 00000 -  "not a valid month"
    

    更新2

    Java Timestamp映射到Oracle DATE数据类型,而不是TIMESTAMP。我不知道这是否有区别,但你可以试试TO_TIMESTAMP(?)

    但是,我将更改查询以允许在LOGGED_TIME上使用潜在索引:

    SELECT ID, STATUS, LOGGED_TIME, SERVER_TIME
      FROM table_1
     WHERE LOGGED_TIME BETWEEN ? AND ?
     ORDER BY LOGGED_TIME DESC
    

    然后用Java完成所有数学运算:

    Timestamp controlTime = Timestamp.valueOf("2014-08-15 03:52:00");
    Calendar cal = Calendar.getInstance();
    cal.setTime(controlTime);
    cal.add(Calendar.DAY_OF_MONTH, -10);
    lookupTime.setTimestamp(1, new Timestamp(cal.getTimeInMillis()));
    cal.setTime(controlTime);
    cal.add(Calendar.DAY_OF_MONTH, 10);
    lookupTime.setTimestamp(2, new Timestamp(cal.getTimeInMillis()));
    try (ResultSet rs = lookupTime.executeQuery()) {
        while (rs.next()) {
            long tdiffInSeconds = (rs.getTimestamp("LOGGED_TIME").getTime() - controlTime.getTime()) / 1000;
            // other code
        }
    }