sql >> Database >  >> RDS >> Oracle

Slaapstand Oracle INTERVAL EXPRESSION en Oracle 11g Dialect

Na 2 dagen lijden, het analyseren van AST-verwerking van de broncode van de slaapstand, gaf ik het eindelijk op !! =P .. In feite is er nog geen Oracle 11g Dialect beschikbaar.

Dus heb ik de strategie gewijzigd en opgelost met de volgende wijzigingen:

1. Maak de volgfunctie op de Oracle-database

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;

DETERMINISTISCHE HINT over de functie is erg belangrijk om prestatieproblemen te voorkomen bij gebruik op waar-clausules. Meer info hierover op link:http://www.inside-oracle-apex.com/caution-when-using-plsql-functions-in-sql-statement/

2. Maak een aangepaste Oracle-dialectklasse en registreer de nieuwe functie.

public class Oracle11gDialectExtended extends Oracle10gDialect {

    public Oracle11gDialectExtended() {

        super();

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

    }
}

Dus, bel het gewoon op @Formula :

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

Of op HQL / NamedQuery :

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



  1. Een database selecteren in mysql met spaties in de naam

  2. Databasemodellering voor een zwakke entiteit

  3. php geeft een ongedefinieerde eigenschap terug

  4. Hoe nvarchar naar decimaal te converteren in SQL