【问题标题】:Compare two dates fetched from a sql table in java比较从java中的sql表中获取的两个日期
【发布时间】:2018-11-26 13:35:39
【问题描述】:

我想比较从 SQL 查询中获取的两个日期,以了解哪个日期更大。 sql中的日期格式是

2018-11-22 11:12:38.291647

我尝试过使用

java.util.Date sqlDate=new java.util.Date(resultset.getDate().getTime());

但它一直要求将数据类型更改为 int。

我也尝试过使用

SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd");
java.util.Date d=df.format(/*date String*/);

但这也行不通。它不断要求将 d 的数据类型更改为 String。

【问题讨论】:

  • 在第二次尝试中,您可以将日期格式“yyyy-MM-dd”更正为 sql 日期“2018-11-22 11:12:38.291647”的格式。它可能是“yyyy-MM-dd hh:mm:ss.SSS”。请确认格式,我没有测试过。
  • 您应该使用ResultSet.getTimestamp() 而不是getDate(),例如java.sql.Timestamp ts = resultSet.getTimestamp(1) 甚至更好的LocalDateTime ldt = resultSet.getObject(1, LocalDateTime.class)
  • 另外:datetimestamp 值没有“格式”。打印此类值时会应用您看到的任何格式。
  • 你在 SQL 中的数据类型是什么? timestamp?对于日期时间列,它不应该是 char,也就是说,它的格式应该是无关紧要的。
  • 仅供参考,非常麻烦的旧日期时间类,例如 java.util.Datejava.util.Calendarjava.text.SimpleDateFormat 现在是 legacy,被 Java 8 中内置的 java.time 类所取代之后。见Tutorial by Oracle

标签: java date jdbc


【解决方案1】:

您可以使用ORDER BY 命令对 SQL 中的查询结果进行排序。如果您想要“最大”日期,则应按降序排列查询:ORDER BY DESC

这样,您只需提取第一个元素,即可从包含查询结果的 ResultSet 对象中获取最大日期。

【讨论】:

    【解决方案2】:

    首先,转换成Date对象:

    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss.sss");
    Date date = format.parse(yourDate);
    

    然后使用Date.afterDate.before 比较它们

    【讨论】:

    【解决方案3】:

    这种格式在java中通过比较字符串是可以比较的,所以不需要任何转换:

    String date1 = "2018-11-22 11:12:38.291647";
    String date2 = "2018-11-23 10:11:00.090600";
    int result = date1.compareTo(date2);
    
    System.out.println(result);
    

    将打印

    -1
    

    因为date2date1“更大”。
    如果date1 大于date2,则结果为1
    如果date1date2“相等”,则结果为0

    【讨论】:

      【解决方案4】:

      数据库中没有“格式”

      sql中的日期格式为2018-11-22 11:12:38.291647

      不,不是。

      存储在日期时间类型中的日期时间值没有“格式”。格式用于字符串。数据库通过其内部定义的数据结构存储日期时间值。该数据结构的细节与我们无关。

      智能对象,而不是哑字符串

      将日期时间类的日期时间对象与数据库交换日期时间列中存储的值。

      从 JDBC 4.2 开始,我们可以与数据库交换 java.time 对象。无需再使用那些糟糕的遗留类,例如java.sql.Timestampjava.sql.Datejava.util.Datejava.util.Calendar

      暂时,在数据库中使用类似于 SQL 标准 TIMESTAMP WITH TIME ZONE 类型的列。

      OffsetDateTime

      对于这样的列,将OffsetDateTime 对象传递给您准备好的语句。通常最好在 UTC 工作。

      Instant instant = Instant.parse( "2018-11-22T11:12:38.291647Z" ) ;  // `Z` on the end means UTC. Pronounced “Zulu”.
      OffsetDateTime odt = instant.atOffset( ZoneOffset.UTC ) ;
      myPreparedStatement.setObject( … , odt ) ;
      

      检索。

      OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;
      

      比较

      使用isBeforeisAfterisEqual 比较OffsetDateTime 对象。

      boolean aIsBeforeThanB = odtA.isBefore( odtB );
      

      关于java.time

      java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.DateCalendarSimpleDateFormat

      Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。

      要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310

      您可以直接与您的数据库交换 java.time 对象。使用符合JDBC 4.2 或更高版本的JDBC driver。不需要字符串,不需要java.sql.* 类。

      从哪里获得 java.time 类?

      ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-01
        • 2012-01-12
        • 2017-04-28
        相关资源
        最近更新 更多