Aquí podría ser tu PUBLICIDAD


Ejecutando Fecha / Hora Matemáticas en HQL?

votos
16

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

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 cualquier unidad en particular, aunque cualquier cosa mayor a las horas sería indeseable, y los segundos serían más convenientes.

ACLARACIÓ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 utilizar el tiempo del servidor de la base de datos, en lugar del tiempo del sistema de consultas. Ejemplo práctico: estoy consultando una marca de tiempo automática para todas las entradas realizadas dentro del último (x) período de tiempo. Dado que la marca de tiempo la realiza el sistema de base de datos, también es importante utilizar la hora actual de la base de datos.

Publicado el 12/03/2009 a las 17:55
fuente por usuario jdmichal
En otros idiomas...        العربية       

4 respuestas

votos
10

¿Por qué necesitas hacerlo en la consulta? ¿Por qué no solo manejarlo en el código java?

por ejemplo:

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

Y luego solo establece los parámetros.

Respondida el 12/03/2009 a las 09:27
fuente por usuario ccclark


Aquí podría ser tu PUBLICIDAD


votos
4

Puede determinar la sintaxis para hacerlo usando SQL en su base de datos y luego definir una función dentro de un HibernateDialect personalizado. Por ejemplo, necesitamos una función de día de la 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 otros. De esta manera, no tiene que escribir SQL sin procesar en su consulta y si alguna vez necesita cambiar las bases de datos, solo asigna la función de forma diferente en su dialecto.

Respondida el 13/03/2009 a las 05:04
fuente por usuario Brian Deterling

votos
3

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

Respondida el 15/09/2009 a las 01:12
fuente por usuario Ridcully

votos
1

¿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 )
Respondida el 13/03/2009 a las 08:12
fuente por usuario ccclark