sql >> Databasteknik >  >> RDS >> Oracle

Viloläge Oracle INTERVAL EXPRESSION och Oracle 11g Dialect

Efter 2 dagars lidande och analyserat AST-bearbetning av källkod i viloläge gav jag äntligen upp !! =P .. Det finns faktiskt ingen Oracle 11g Dialect tillgänglig än.

Så jag ändrade strategin och löser den med följande ändringar:

1. Skapa följningsfunktionen på Oracle-databasen

CREATE OR REPLACE FUNCTION INTERVAL_HOURS_AGO(HOURS_PARAM IN NUMBER) 
   RETURN DATE DETERMINISTIC
   IS TIME_AGO DATE;
   BEGIN 
      SELECT (SYSDATE - INTERVAL '1' HOUR * HOURS_PARAM) INTO TIME_AGO FROM DUAL;
      RETURN(TIME_AGO); 
    END;

DETERMINISTISKT TIPS om funktion är mycket viktigt för att undvika prestandaproblem när du använder den på Where-Clausules. Mer information om det på länken:http://www.inside-oracle-apex.com/caution-when-using-plsql-functions-in-sql-statement/

2. Skapa en anpassad Oracle Dialect Class och registrera den nya funktionen.

public class Oracle11gDialectExtended extends Oracle10gDialect {

    public Oracle11gDialectExtended() {

        super();

       registerFunction("interval_hours_ago", 
           new StandardSQLFunction("INTERVAL_HOURS_AGO", StandardBasicTypes.DATE));

    }
}

Så, ring det bara på @Formula :

@Formula(" INTERVAL_HOURS_AGO( SHOW_LIMIT_HOURS ) ")
private Date showLimitDate;

Eller på HQL / NamedQuery :

select p from Product p 
  where p.createdAt > interval_hours_ago(60)



  1. Hur väljer man från mysql där sista tecknet i en sträng =x?

  2. Hur DB_NAME() fungerar i SQL Server

  3. Hur lägger jag till en kontrollbegränsning i en Rails-migrering?

  4. Skapa en sekvens med START WITH från Query