Pergunta

Eu estou olhando como executar matemática data / hora dentro de uma consulta HQL. Especificamente, como faço para adicionar ou subtrair (x) quantidade de tempo a partir do resultado da função current_timestamp()? Ou eu tenho de usar SQL para isso e esperança de que qualquer banco de dados está sendo executado suporta isso?

HQL consulta de exemplo:

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

Eu posso definir o:. Parâmetro timeToSubtract ser qualquer unidade particular, mas nada maior do que horas seria indesejável, e segundos seria mais desejável

ESCLARECIMENTO: Sei que isso pode ser feito facilmente fora da consulta. Mas, por razões filosóficas, digamos que é importante usar o tempo do servidor de banco de dados, ao invés de tempo do sistema de consulta. Exemplo prático: Eu estou consultando um timestamp automático para todas as entradas feitas no (x) último período de tempo. Desde a hora é feita pelo sistema de banco de dados, é importante também usar o tempo atual do banco de dados.

Foi útil?

Solução

Se você precisa de tempo do servidor de banco de dados, você pode primeiro fazer uma consulta HQL simples para obter o timestamp e, em seguida, calcular o maxTimestamp em java e passar o timestamp buscada eo maxTimeStamp calculado a uma consulta como a de ccclark.

Outras dicas

Por que você precisa para fazê-lo na consulta? Por que não apenas lidar com isso no código java.

Por exemplo:

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

E, em seguida, basta definir os parâmetros.

Você poderia determinar a sintaxe para fazer isso usando SQL em seu banco de dados e, em seguida, definir uma função dentro de um HibernateDialect personalizado. Por exemplo, precisávamos de uma função de semana que não é padrão SQL. Nós subclasse o dialeto para cada banco de dados e, em seguida, acrescentou uma linha como esta:

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

No seu caso, você poderia usar uma função chamada date_diff que pode ser definida como? -? em alguns bancos de dados ou algo diferente em outros. Dessa forma, você não tem que escrever SQL cru em sua consulta e se você alguma vez precisar de bases de dados de comutação, você só mapear a função de forma diferente em seu dialeto.

Tem que ser HQL? Eu provavelmente iria mudar-se para um critério de hibernação e uso:

Criteria.add( Restrictions.SQLRestriction( "{alias} <= current_timestamp() " ) )
Criteria.add( Restrictions.SQLRestriction( "{alias} >= (current_timestamp() + ?) ", 5 )
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top