选择在接下来的30天内到期的记录--sql语句

问题描述 投票:-2回答:2

数据类型:timestamp列名:dlExpiryDate

SELECT * 
  FROM QUALIFICATION  
 WHERE dlExpiryDate >= NOW() 
   AND dlExpiryDate < NOW() + INTERVAL 1 MONTH;

尝试了大量的查询以获得答案,但它不起作用。有人得到了解决这个问题的答案。我上面试过一个例子,但它不起作用。打印出栈跟踪:

严重:java.sql.SQLSyntaxErrorException:语法错误:在org.apache.derby.client.am的org.apache.derby.client.am.SQLExceptionFactory40.getSQLException(未知来源)的第1行第93列遇到“1”位于org.apache.jasper的org.apache.jsp.viewQualification_jsp._jspService(viewQualification_jsp.java:105)org.apache.derby.client.am.Statement.executeQuery(未知来源)的.SqlException.getSQLException(未知来源)。运行时.httpJspBase.service(HttpJspBase.java:111)位于org.apache.ja上的org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:411)的javax.servlet.http.HttpServlet.service(HttpServlet.java:790)位于org.apache.jasper.servlet.JspServlet.service(JspServlet.java:377)的.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:473),位于javax.servlet.http.HttpServlet.service(HttpServlet.java) :790)org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1682)org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:318)a t org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:160)org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:734)org.apache.catalina.core.StandardPipeline.invoke (StandardPipeline.java:673)位于org.apache的org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:174)的com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:99)。 catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:416)位于org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:283)的com.sun.enterprise.v3.services.impl.ContainerMapper $ HttpHandlerCallable。在com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:167)调用(ContainerMapper.java:459)org.glassfish.grizzly.http.server.HttpHandler.runService(HttpHandler.java: 206)在org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:180)org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:235) )org.glassfish.grizzly.filterchain.ExecutorResolver $ 9.execute(ExecutorResolver.java:119)org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:283)at org.glassfish.grizzly.filterchain.DefaultFilterChain .executeChainPart(DefaultFilterChain.java:200)org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:132)org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:111)org。在org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:536)的org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy。)中的glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77)。 java:112)org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:117)org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access $ 100(WorkerThreadIOStrategy.java:56)org.glassfish.grizzly。 strategies.WorkerThreadIOStra teg $ WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:137)org.glassfish.grizzly.threadpool.AbstractThreadPool $ Worker.doWork(AbstractThreadPool.java:591)org.glassfish.grizzly.threadpool.AbstractThreadPool $ Worker.run(AbstractThreadPool。 java:571)at java.lang.Thread.run(Thread.java:745)引起:org.apache.derby.client.am.SqlException:语法错误:在第1行第93列遇到“1”。在org位于org.apache.derby.client.net.NetStatementReply.parsePrepareError(未知来源)的.apache.derby.client.am.Statement.completeSqlca(未知来源)org.apache.derby.client.net.NetStatementReply.parsePRPSQLSTTreply(未知)来自org.apache.derby.client.net.NetStatement的org.apache.derby.client.net.NetStatementReply.readPrepareDescribeOutput(未知来源)org.apache.derby.client.net.StatementReply.readPrepareDescribeOutput(未知来源) org.apache上org.apache.derby.client.am.Statement.readPrepareDescribeOutput(未知来源)的.readPrepareDescribeOutput_(未知来源) org.apache.derby.client.am.Statement.executeQueryX(未知来源)的.derby.client.am.Statement.flowExecute(未知来源)... 36更多

有人得到了答案吗?谢谢

java date derby
2个回答
1
投票

如果要以与数据库无关的方式执行该查询,请在Java代码中解析2个日期并使用PreparedStatement提供它们。

LocalDate today = LocalDate.now();
String sql = "SELECT *" +
              " FROM QUALIFICATION" +
             " WHERE dlExpiryDate >= ?" +
               " AND dlExpiryDate < ?";
try (PreparedStatement stmt = conn.prepareStatement(sql)) {
    stmt.setDate(1, java.sql.Date.valueOf(today));
    stmt.setDate(2, java.sql.Date.valueOf(today.plusMonths(1)));
    try (ResultSet rs = stmt.executeQuery()) {
        // code here
    }
}

根据JDBC驱动程序(例如,不是Microsoft),您也可以使用setObject

stmt.setObject(1, today);
stmt.setObject(2, today.plusMonths(1));

1
投票

Time zone

请注意,Derby中的TIMESTAMP类型类似于SQL标准类型TIMESTAMP WITHOUT TIME ZONE(至少看起来这样,文档编写得很糟糕)。意思是,那种类型缺乏time zoneoffset-from-UTC的任何概念。因此,此类型不代表特定时刻,即时间轴上的一个点。相反,它代表了全球约26-27小时范围内的潜在时刻。

例如,如果您在2019年1月23日中午存储,我们不知道您是在日本东京中午,还是在加尔各答印度中午时分。或许你的意思是几小时后,法国巴黎的中午。或者更长时间后,当中午到达蒙特利尔魁北克时。这种类型的这种值将意味着23日中午的任何地方,在26-27小时范围内的许多时刻。

因此,与现在的当前时刻相比,对此类型进行查询是没有意义的。

但…

如果您一直在处理应用程序中的时区,并假装数据库中的所有值都属于某个时区,请在捕获当前时刻时使用该区域。

ZonedDateTime

在java.time类中,我们使用ZonedDateTime来表示特定区域(时区)的人们使用的挂钟时间。

ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime zdt = ZonedDateTime.now( z ) ;  // Capture the current moment as seen in the wall-clock time used by the people of a particular region (a time zone).

Discarding valuable zone/offset info with LocalDateTime

我们可以删除时区信息,只在LocalDateTime对象中留下日期和时间。

LocalDateTime ldt = zdt.toLocalDateTime()

Start-of-day

如果搜索一个月,您可能希望从一天开始。暂时,我们会让java.time确定一天中的第一个时刻,因为一天并不总是从00:00开始,因为夏令时(DST)等异常。但由于LocalDateTime缺乏区域/偏移,我们无法解释这种异常现象。所以我们将在00:00前往。

LocalDateTime ldtStartOfDay = ldt.with( LocalTime.MIN ) ;

Date-time math

要添加月份,我们可以使用plus…minus…方法进行日期时间数学运算。

LocalDateTime ldtMonthLater = ldtStartOfDay.plusMonths() ;

SQL placeholders

传递这些值以在预准备语句中替换SQL中的占位符。

SELECT * 
FROM QUALIFICATION  
WHERE dlExpiryDate >= ?
AND dlExpiryDate < ?
;

JDBC 4.2

从JDBC 4.2及更高版本开始,我们可以使用setObjectgetObject直接与数据库交换java.time对象。无需使用像java.sql.Timestamp这样可怕的遗留类。

myPreparedStatement.setObject( 1 , ldtStartOfDay) ;
myPreparedStatement.setObject( 2 , ldtMonthLater) ;

检索时。

LocalDateTime ldt = myResultSet.getObject( … , LocalDateTime.class ) ;

Consider other databases

您可能需要考虑使用其他数据库。 Oracle停止将Derby捆绑为Java DB,因为它被发现不适合生产使用。

如果你想要一个用Java编写的开源数据库,我建议使用H2 Database Engine,既适用于嵌入式应用,也适用于服务器。如果你想要一个为重型企业级工作而构建的开源数据库服务器,我建议Postgres


About java.time

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

现在在Joda-Timemaintenance mode项目建议迁移到java.time班。

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

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

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展了java.time。该项目是未来可能添加到java.time的试验场。你可能会在这里找到一些有用的类,如IntervalYearWeekYearQuartermore

© www.soinside.com 2019 - 2024. All rights reserved.