JDBC java.sql.Date()比较是假的

时间:2014-07-16 20:49:59

标签: java sql sql-server date jdbc

我很好奇为什么if比较是假的:

我使用以下代码在日期字段中插入日期:

preparedStatement.setDate(1, new java.sql.Date(new java.util.Date().getTime()));
System.out.println("sql date" + new java.sql.Date(new java.util.Date().getTime()));
output is: 2014-07-16

插入后,我查询数据库以查明今天是否插入了记录:

    String sql = select MAX (last_modified) as last_modified from mydb.mytable
    ResultSet rs = stmt.executeQuery(sql);

    while (rs.next())
    {

        if (rs.getDate(1).equals(new java.sql.Date(new java.util.Date().getTime())))
        {
            System.out.println("Same Date in here not need to update");
         }
        else
        {
            System.out.println("Dates are different");
        }

        System.out.println("date from db: " + rs.getDate(1));  
        System.out.println("new sql date: " + new java.sql.Date(new java.util.Date().getTime()));: 
    }

输出结果为:

Dates are different
date from db: 2014-07-16
new sql date: 2014-07-16

我认为两个日期都相似,并且两者都是为了匹配java.sql.Date,可能条件不正确。

我感谢您理解此行为的任何帮助。

3 个答案:

答案 0 :(得分:5)

你工作太辛苦了。在现代Java中进行这种比较有更简单,更清晰的方法。

旧的java.util.Date,java.sql.Date和.Calendar类非常麻烦,应该避免使用。

java.sql.Date是一个Hack

java.sql.Date只是一个java.util.Date,其时间设置为00:00:00(UTC)。这是一个古老的蹩脚黑客,可以解决Java的早期版本缺少一个类来表示仅限日期而没有任何时间或时区的事实。

java.time

现在,Java 8确实有一个仅限日期的类LocalDate,可在新的java.time package中找到。

已将方法添加到java.sql.Date类以转换为/来自LocalDate。

LocalDate localDate = someSqlDate.toLocalDate();
LocalDate today = LocalDate.now( ZoneOffset.UTC ); // Pass a time zone to get current date in UTC for fair comparison.
boolean localDateIsToday = localDate.isEqual( today );

走另一条路......

java.sql.Date sqlDate = java.sql.Date.valueOf( someLocalDate );

JDBC 4.2驱动程序

如果您的JDBC驱动程序已更新为支持JDBC 4.2,那么根据JDBC 4.2 Spec Update(第21项),您可以在ResultSet上调用getObject方法直接获取{{1}对象。

同样,调用LocalDatesetObject对象传递到数据库中的SQL DATE type列。

完全避免LocalDate

约达时间

java.time包的灵感来自Joda-Time库。您可以在Java的早期版本中使用它,其中java.time不可用。 Joda-Time也提供LocalDate课程。

答案 1 :(得分:3)

您正在比较Datelong

if (rs.getDate(1).equals(new java.sql.Date(new java.util.Date().getTime())))

将其更改为

if (rs.getDate(1).getTime() == System.currentTimeInMillis())

从你的提交中你想要日级精度

    Calendar startOfToday = Calendar.getInstance();
    Calendar endOfToday = Calendar.getInstance();
    endOfToday.setTime(startOfToday.getTime());

    startOfToday.set(Calendar.HOUR_OF_DAY, 0);
    startOfToday.set(Calendar.MINUTE, 0);
    startOfToday.set(Calendar.SECOND, 0);
    startOfToday.set(Calendar.MILLISECOND, 0);

    endOfToday.set(Calendar.HOUR_OF_DAY, 23);
    endOfToday.set(Calendar.MINUTE, 59);
    endOfToday.set(Calendar.SECOND, 59);
    endOfToday.set(Calendar.MILLISECOND, 999);

    long transactionDate = rc.getDate(1).getTime();
    if(transactionDate >= startOfToday.getTimeInMillis() && transactionDate <= endOfToday.getTimeInMillis()){

    }

答案 2 :(得分:1)

将测试更改为:

if (rs.getDate(1).toString().equals(new java.sql.Date(System.currentMillis()).toString())