Pregunta

Estoy buscando cómo realizar cálculos de fecha / hora dentro de una consulta HQL. Específicamente, ¿cómo agrego o resta (x) cantidad de tiempo del resultado de la función current_timestamp () ? ¿O debo ingresar a SQL para esto y esperar que cualquier base de datos que se esté ejecutando lo admita?

Ejemplo de consulta HQL:

FROM RandomThing
WHERE randomTime IS NOT NULL AND
      randomTime >= current_timestamp() AND
      randomTime <= (current_timestamp() + :timeToAdd)

Puedo definir el parámetro: timeToSubtract para que sea una unidad en particular, aunque cualquier cosa mayor que las horas sería indeseable, y los segundos serían los más deseables.

CLARIFICACIÓN: Me doy cuenta de que esto se puede hacer fácilmente fuera de la consulta. Pero por razones filosóficas, digamos que es importante usar el tiempo del servidor de la base de datos, en lugar del tiempo del sistema de consulta. Ejemplo práctico: estoy consultando una marca de tiempo automática para todas las entradas realizadas dentro de la última (x) cantidad de tiempo. Dado que la marca de tiempo es hecha por el sistema de base de datos, es importante usar también la hora actual de la base de datos.

¿Fue útil?

Solución

Si necesita el tiempo del servidor de la base de datos, primero puede hacer una simple consulta hql para obtener la marca de tiempo y luego calcular maxTimestamp en java y pasar la marca de tiempo obtenida y el maxTimeStamp calculado a una consulta como la de ccclark.

Otros consejos

¿Por qué necesita hacerlo en la consulta? ¿Por qué no solo manejarlo en el código de Java?

por ejemplo:

From RandomThing
Where randomTime is not null and
      randomTime >= :currentTimestamp and
      randomTime <= :maxTimestamp

Y luego simplemente configure los parámetros.

Puede determinar la sintaxis para hacerlo utilizando SQL en su base de datos y luego definir una función dentro de un HibernateDialect personalizado. Por ejemplo, necesitábamos una función entre semana que no sea SQL estándar. Subclasificamos el dialecto para cada base de datos y luego agregamos una línea como esta:

registerFunction("weekday", 
  new SQLFunctionTemplate(Hibernate.INTEGER, "to_char(?1,'D')") );

En su caso, podría usar una función llamada date_diff que podría definirse como? -? en algunas bases de datos o algo diferente en otras. De esa manera, no tiene que escribir SQL sin procesar en su consulta y si alguna vez necesita cambiar bases de datos, simplemente asigna la función de manera diferente en su dialecto.

¿Tiene que ser HQL? Probablemente cambiaría a un criterio de hibernación y usaría:

Criteria.add( Restrictions.SQLRestriction( "{alias} <= current_timestamp() " ) )
Criteria.add( Restrictions.SQLRestriction( "{alias} >= (current_timestamp() + ?) ", 5 )
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top