>

데이터 유형 : timestamp 열 이름 : dlExpiryDate

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

답을 얻기 위해 많은 양의 쿼리를 시도했지만 작동하지 않습니다. 누구나이 문제를 해결하기위한 대답을 얻었습니다. 위에서 시도한 예제가 있지만 작동하지 않습니다. 스택 추적을 인쇄했습니다 :

Severe: java.sql.SQLSyntaxErrorException: Syntax error: Encountered "1" at line 1, column 93. at org.apache.derby.client.am.SQLExceptionFactory40.getSQLException(Unknown Source) at org.apache.derby.client.am.SqlException.getSQLException(Unknown Source) at org.apache.derby.client.am.Statement.executeQuery(Unknown Source) at org.apache.jsp.viewQualification_jsp._jspService(viewQualification_jsp.java:105) at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:111) at javax.servlet.http.HttpServlet.service(HttpServlet.java:790) at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:411) at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:473) at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:377) at javax.servlet.http.HttpServlet.service(HttpServlet.java:790) at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1682) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:318) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:160) at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:734) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:673) at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:99) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:174) at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:416) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:283) at com.sun.enterprise.v3.services.impl.ContainerMapper$HttpHandlerCallable.call(ContainerMapper.java:459) at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:167) at org.glassfish.grizzly.http.server.HttpHandler.runService(HttpHandler.java:206) at org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:180) at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:235) at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119) at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:283) at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:200) at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:132) at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:111) at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77) at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:536) at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:112) at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:117) at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:56) at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:137) at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:591) at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:571) at java.lang.Thread.run(Thread.java:745) Caused by: org.apache.derby.client.am.SqlException: Syntax error: Encountered "1" at line 1, column 93. at org.apache.derby.client.am.Statement.completeSqlca(Unknown Source) at org.apache.derby.client.net.NetStatementReply.parsePrepareError(Unknown Source) at org.apache.derby.client.net.NetStatementReply.parsePRPSQLSTTreply(Unknown Source) at org.apache.derby.client.net.NetStatementReply.readPrepareDescribeOutput(Unknown Source) at org.apache.derby.client.net.StatementReply.readPrepareDescribeOutput(Unknown Source) at org.apache.derby.client.net.NetStatement.readPrepareDescribeOutput_(Unknown Source) at org.apache.derby.client.am.Statement.readPrepareDescribeOutput(Unknown Source) at org.apache.derby.client.am.Statement.flowExecute(Unknown Source) at org.apache.derby.client.am.Statement.executeQueryX(Unknown Source) ... 36 more

누구든지 이것에 대한 답변을 받았습니까? 감사합니다


  • 답변 # 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));
    
    

  • 답변 # 2

    시간대

    와이즈 비즈  Derby의 유형은 SQL 표준 유형 TIMESTAMP 와 유사합니다.  (적어도 문서가 제대로 작성되지 않은 것 같습니다). 즉, 해당 유형에는 표준 시간대 또는 UTC에서 오프셋 개념이 없습니다. 따라서이 유형은 타임 라인의 특정 지점 인아님을 나타냅니다. 대신, 전 세계 시간대 인 26-27 시간 범위의잠재적순간을 나타냅니다.

    예를 들어 2019 년 1 월 23 일 정오를 저장 한 경우, 일본 도쿄에서 정오를 의미했는지 또는 콜카타 인도에서 정오 이전에 정오를 의미했는지 알 수 없습니다. 아니면 몇 시간 후에 파리 프랑스 정오를 의미했을 수도 있습니다. 또는 정오가 몬트리올 퀘벡에 도착했을 때 더 많은 시간 후에. 이 유형의 값은 26-27 시간 범위의 여러 순간 동안 23 일어딘가에 정오를 의미합니다.

    현재의 현재 시점과 비교할 때이 유형에 대해쿼리를 수행하는 것은 의미가 없습니다.

    그러나…

    앱에서 시간대를 처리하고 데이터베이스의 모든 값이 특정 시간대 인 것처럼 가장 한 경우 현재 시점을 캡처 할 때 해당 시간대를 사용하십시오.

    와이즈 위즈

    java.time클래스에서 TIMESTAMP WITHOUT TIME ZONE 를 사용합니다  특정 지역 (시간대)의 사람들이 사용하는 벽시계 시간의 순간을 나타냅니다.

    ZonedDateTime
    
    
    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
    
    
    오늘 시작

    한 달을 검색하는 경우 하루가 시작될 때 시작하고 싶을 것입니다. 일광 절약 시간 (DST)과 같은 예외로 인해 하루가 항상 00:00에 시작되는 것은 아니기 때문에java.time에서 오늘의 첫 순간을 결정하게 할 것입니다. 그러나 LocalDateTime 와 함께  영역/오프셋이 없으면 이러한 이상을 설명 할 수 없습니다. 그래서 우리는 00:00과 함께 갈 것입니다.

    LocalDateTime ldt = zdt.toLocalDateTime()
    
    
    날짜 수학

    월을 추가하기 위해 LocalDateTime 를 사용하여 날짜-시간 수학을 할 수 있습니다  그리고 LocalDateTime ldtStartOfDay = ldt.with( LocalTime.MIN ) ;  방법.

    plus…
    
    
    SQL 자리 표시 자

    준비된 명령문에서 SQL의 플레이스 홀더를 바꾸려면이 값을 전달하십시오.

    minus…
    
    
    JDBC 4.2

    JDBC 4.2 이상에서 LocalDateTime ldtMonthLater = ldtStartOfDay.plusMonths() ; 를 사용하여java.time객체를 데이터베이스와 직접 교환 할 수 있습니다  & SELECT * FROM QUALIFICATION WHERE dlExpiryDate >= ? AND dlExpiryDate < ? ; . setObject 와 같은 끔찍한 레거시 클래스를 사용할 필요가 없습니다. .

    getObject
    
    

    검색 할 때.

    java.sql.Timestamp
    
    
    다른 데이터베이스 고려

    다른 데이터베이스 사용을 고려할 수도 있습니다. 오라클은 Derby를Java DB로 번들링하는 것을 중단했습니다. 프로덕션 용도로는 적합하지 않은 것으로 밝혀졌습니다.

    자바로 작성된 오픈 소스 데이터베이스를 원한다면 서버뿐만 아니라 임베디드 사용에 적합한 H2 데이터베이스 엔진을 제안한다. 강력한 엔터프라이즈 급 작업을 위해 구축 된 오픈 소스 데이터베이스 서버를 원한다면 Postgres를 추천합니다.

    <시간> java.time정보

    java.time프레임 워크는 Java 8 이상에 내장되어 있습니다. 이 클래스는 myPreparedStatement.setObject( 1 , ldtStartOfDay) ; myPreparedStatement.setObject( 2 , ldtMonthLater) ; 와 같은 번거로운 오래된 레거시 날짜-시간 클래스를 대체합니다. LocalDateTime ldt = myResultSet.getObject( … , LocalDateTime.class ) ;java.util.Date .

    유지 보수 모드 인Joda-Time프로젝트는 java.time 클래스로의 마이그레이션을 권장합니다.

    자세한 내용은Oracle Tutorial을 참조하십시오. 많은 예제와 설명을 보려면 스택 오버플로를 검색하십시오. 사양은 JSR 310입니다.

    java.time객체를 데이터베이스와 직접 교환 할 수 있습니다. JDBC 4.2 이상을 준수하는 JDBC 드라이버를 사용하십시오. 문자열 필요, Calendar 필요 없음  수업.

    java.time 클래스는 어디서 구할 수 있습니까?

    Java SE 8,Java SE 9,Java SE 10,Java SE 11이상- 번들로 구현 된 표준 Java API의 일부입니다.

    Java 9에는 몇 가지 사소한 기능과 수정 사항이 추가되었습니다.

    Java SE 6Java SE 7

    java.time기능의 대부분은ThreeTen-Backport에서 Java 6&7로 백 포트됩니다.

    Android

    java.time클래스의 최신 버전의 Android 번들 구현

    이전 Android (<26)의 경우ThreeTenABP프로젝트는ThreeTen-Backport에 적용됩니다 (위에서 언급). .threeTenABP 사용 방법…을 참조하십시오.

    ThreeTen-Extra프로젝트는 추가 클래스로 java.time을 확장합니다. 이 프로젝트는 향후 java.time에 추가 될 수있는 입증 된 근거입니다. SimpleDateFormat 와 같은 유용한 클래스가 있습니다. java.sql.* Interval 등이 있습니다.

    YearWeek

관련 자료

  • 이전 c++ - 2 차 베 지어를 3 차 베지 어로 변환
  • 다음 c++ - 복합 유형에 대한 qvector vs std - : vector