数据类型: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代码中解析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));
请注意,Derby中的TIMESTAMP
类型类似于SQL标准类型TIMESTAMP WITHOUT TIME ZONE
(至少看起来这样,文档编写得很糟糕)。意思是,那种类型缺乏time zone或offset-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).
LocalDateTime
我们可以删除时区信息,只在LocalDateTime
对象中留下日期和时间。
LocalDateTime ldt = zdt.toLocalDateTime()
如果搜索一个月,您可能希望从一天开始。暂时,我们会让java.time确定一天中的第一个时刻,因为一天并不总是从00:00开始,因为夏令时(DST)等异常。但由于LocalDateTime
缺乏区域/偏移,我们无法解释这种异常现象。所以我们将在00:00前往。
LocalDateTime ldtStartOfDay = ldt.with( LocalTime.MIN ) ;
要添加月份,我们可以使用plus…
和minus…
方法进行日期时间数学运算。
LocalDateTime ldtMonthLater = ldtStartOfDay.plusMonths() ;
传递这些值以在预准备语句中替换SQL中的占位符。
SELECT *
FROM QUALIFICATION
WHERE dlExpiryDate >= ?
AND dlExpiryDate < ?
;
从JDBC 4.2及更高版本开始,我们可以使用setObject
和getObject
直接与数据库交换java.time对象。无需使用像java.sql.Timestamp
这样可怕的遗留类。
myPreparedStatement.setObject( 1 , ldtStartOfDay) ;
myPreparedStatement.setObject( 2 , ldtMonthLater) ;
检索时。
LocalDateTime ldt = myResultSet.getObject( … , LocalDateTime.class ) ;
您可能需要考虑使用其他数据库。 Oracle停止将Derby捆绑为Java DB,因为它被发现不适合生产使用。
如果你想要一个用Java编写的开源数据库,我建议使用H2 Database Engine,既适用于嵌入式应用,也适用于服务器。如果你想要一个为重型企业级工作而构建的开源数据库服务器,我建议Postgres。
java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,如java.util.Date
,Calendar
和SimpleDateFormat
。
现在在Joda-Time的maintenance 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的试验场。你可能会在这里找到一些有用的类,如Interval
,YearWeek
,YearQuarter
和more。