sql中的java日期时间

rnmwe5a2  于 2021-06-21  发布在  Mysql
关注(0)|答案(2)|浏览(403)

我有这段代码

while(activecheck.next()){
    Date status;
    String vincheck;
    Date curr = new Date();
    int datecheck;
    status = activecheck.getDate(8);
    vincheck = activecheck.getString(2);
    String update = "UPDATE Auctions SET status = '"+inactive+"' WHERE vin = '"+vincheck+"'";
    datecheck = status.compareTo(curr);

    if(datecheck < 0){  
        stmt6.executeUpdate(update);
    }
}

它遍历mysql表检查非活动出价。我试图检查sql行中列出的日期和时间是否已被当前时间传递。然而,每当我这样做,似乎只是比较日期,而不是时间。这可能是什么原因?
这是我使用的格式:yyyy-mm-dd hh:mm:ss`

00jrzges

00jrzges1#

应该使用名为timestamp的类型,而不是日期。这样,您将涵盖日期和当前时间

Timestamp timestamp = new Timestamp(System.currentTimeMillis());
rggaifut

rggaifut2#

热释光;博士

if( 
    myResultSet.getObject( … , Instant.class )  // Retrieve `Instant` (a moment in UTC) from database using JDBC 4.2 or later.
               .isBefore( Instant.now() )       // Comparing to the current moment captured in UTC.
)
{ 
    … 
}

java.util.date与java.sql.date

您可能会混淆这对不幸命名错误的类。第一个是日期和时间类型,以utc为单位。第二种是仅日期类型。实际上,第二个假装是一个日期类型,但实际上有一天的时间设置为00:00:00。更糟糕的是,第二个继承自第一个,但是文档指示我们忽略这个事实。
困惑?对。这些糟糕的课程设计得很糟糕。避开他们。

java.time文件

您正在使用非常麻烦的旧日期时间类,这些类在几年前被java.time类所取代。

瞬间

这个 java.util.Date 类替换为 java.time.Instant . 这个 Instant 类表示时间线上的一个时刻(utc),分辨率为纳秒(最多九(9)位小数)。

本地日期

这个 java.sql.Date 类替换为 java.time.LocalDate . 这个 LocalDate 类表示一个仅限日期的值,不包含一天中的时间和时区。

jdbc 4.2版

从JDBC4.2及更高版本开始,您可以直接与数据库交换java.time类。无需再次使用java.sql或java.util日期时间类型。
小贴士:养成一个习惯,总是使用 PreparedStatement 避免sql注入风险。一旦你习惯了就不会再工作了。

Instant instant = Instant.now() ;  // Capture the current moment in UTC.
myPreparedStatement.setObject( … , instant ) ;

和检索。

Instant instant = myResultSet.getObject( … , Instant.class ) ;

聪明的东西,而不是愚蠢的字符串

这是我使用的格式:yyyy-mm-dd hh:mm:ss`
存储在数据库中的日期时间值没有“格式”。这些值由一些内部定义的机制存储,这些机制与我们无关。它们不是字符串(也就是说,在任何严肃的数据库中都不是)。
您的数据库和java日期时间对象可以解析表示日期时间值的字符串来创建该值。它们可以生成一个字符串来表示这个值。但是字符串和日期时间值是不同的、独立的,不应混为一谈。
使用java.time对象与您的数据库交换日期时间值,而不仅仅是字符串,就像您对数据库所理解的数字和其他数据类型所做的那样。仅将字符串用于传递文本值。

比较

要将检索到的值与当前时刻进行比较,请使用 isBefore , isAfter ,和 equals 方法 Instant 班级。

Instant now = Instant.now() ;
…
Instant instant = myResultSet.getObject( … , Instant.class ) ;
boolean isPast = instant.isBefore( now ) ;
if ( isPast ) { 
    … 
}

关于java.time

java.time框架内置于Java8及更高版本中。这些类取代了旧的遗留日期时间类,例如 java.util.Date , Calendar , & SimpleDateFormat .
现在处于维护模式的joda time项目建议迁移到java.time类。
要了解更多信息,请参阅oracle教程。和搜索堆栈溢出的许多例子和解释。规格为jsr 310。
您可以直接与数据库交换java.time对象。使用符合jdbc 4.2或更高版本的jdbc驱动程序。不需要线,不需要线 java.sql.* 班级。
从哪里获得java.time类?
java se 8、java se 9、java se 10及更高版本
内置的。
标准javaapi的一部分,带有一个捆绑的实现。
Java9添加了一些次要的特性和修复。
java se 6和java se 7
大部分java.time功能都是通过310个后端口后端口移植到Java6和Java7的。
安卓
android包java.time类的更高版本实现。
对于早期的android(<26),threetenabp项目采用了threeten backport(如上所述)。了解如何使用threetenabp…。
threeten额外的项目用额外的类扩展了java.time。这个项目是java.time将来可能添加的一个试验场。您可以在这里找到一些有用的类,例如 Interval , YearWeek , YearQuarter ,等等。

相关问题