Subtração de datas

7 respostas
M

Pessoal,
alguém sabe como posso diminuir um timestamp por outro e o retorno ser em minutos no postgre?

preciso de uma consulta do tipo: todos os registros que foram gerados nos ultimos 10 minutos, sendo que o valor 10 o usuário pode alterar.

Aguardo resposta

7 Respostas

K

No Postgre eu não sei, mas no SQL Server seria algo assim

Select datediff(minute,getdate()+‘00:10:00’,getdate()-2)

Att,

M

oi kbardock15,

eu estava pesquisando aqui e achei uma forma de fazer utilizando o interval do postgre.
seria mais ou menos assim:

select r.co_registro from abm.sbmtb007_registro as r 
where ts_ocorrencia >= LOCALTIMESTAMP(1) - interval'10 minutes'

porém eu qro que o valor 10 possa ser alterado qdo em tempo de execução, estou usando JPA na aplicação e quando eu faço:

this.query.setParameter("timeout", "'"+10+" minutes'");

da um erro dizendo que não é possível executar a query. Sabe de alguma forma que eu possa resolver isso?

K

malbarbosa:
oi kbardock15,

eu estava pesquisando aqui e achei uma forma de fazer utilizando o interval do postgre.
seria mais ou menos assim:

select r.co_registro from abm.sbmtb007_registro as r 
where ts_ocorrencia >= LOCALTIMESTAMP(1) - interval'10 minutes'

porém eu qro que o valor 10 possa ser alterado qdo em tempo de execução, estou usando JPA na aplicação e quando eu faço:

this.query.setParameter("timeout", "'"+10+" minutes'");

da um erro dizendo que não é possível executar a query. Sabe de alguma forma que eu possa resolver isso?

Quando você executa no banco da certo ?? só esta dando erro por JPA??

C

Boa tarde!

Acredito que você possa fazer o seguinte:

//...
// Esta Query irá retornar a subtração da data atual pela data_geracao.
PreparedStatement pstm = conn.prepareStatement("SELECT NOW() - data_geracao FROM registros WHERE data_geracao >= ?");

// Recupera uma instância de Calendar contendo a data atual.
Calendar calendar = Calendar.getInstance();
// Subtrai 10 minutos da data atual.
calendar.add(Calendar.MINUTE, -10);
// Define o parâmetro da Query com a data especificada.
pstm.setDate(1, new java.sql.Date(calendar.getTimeInMillis()));
//...

Assim você buscaria todos os registros que possuem a data de geração maior ou igual a data que foi passada como parâmetro.
Como não tenho como testar aqui, não sei te dizer exatamente qual o tipo de retorno que esta query irá te trazer, mas acredito que seja um Timestamp mesmo.

Espero ter ajudado!
Abraço

M

sim…quando eu executo no banco funciona. Só que eu tentei uma forma aqui e deu certo.
Fiz assim:

String jpql = "select r.co_registro from abm.sbmtb007_registro as r "
			+ "where ts_ocorrencia >= LOCALTIMESTAMP(1) - interval'"+configuracao.getTimeout()+" minutes' " 
			+ "and r.no_servico = 'consultar' "
			+ "and r.co_servico = :numero "
			+ "and r.co_terminal = :terminal "
			+ "order by r.co_registro desc";

concatenei o valor com a string, não passei por parâmetro. É meio esquisito mas foi assim que funcionou. Depois vou parar com mais tempo para ver isso.
Mesmo assim obrigado!!

K

Cristiano de Barros:
Boa tarde!

Acredito que você possa fazer o seguinte:

//...
// Esta Query irá retornar a subtração da data atual pela data_geracao.
PreparedStatement pstm = conn.prepareStatement("SELECT NOW() - data_geracao FROM registros WHERE data_geracao >= ?");

// Recupera uma instância de Calendar contendo a data atual.
Calendar calendar = Calendar.getInstance();
// Subtrai 10 minutos da data atual.
calendar.add(Calendar.MINUTE, -10);
// Define o parâmetro da Query com a data especificada.
pstm.setDate(1, new java.sql.Date(calendar.getTimeInMillis()));
//...

Assim você buscaria todos os registros que possuem a data de geração maior ou igual a data que foi passada como parâmetro.
Como não tenho como testar aqui, não sei te dizer exatamente qual o tipo de retorno que esta query irá te trazer, mas acredito que seja um Timestamp mesmo.

Espero ter ajudado!
Abraço

é uma boa solução, contudo tens que cuidar que a data do Banco esteja sincronizada com da aplicação.

C

kbardock15:
Cristiano de Barros:
Boa tarde!

Acredito que você possa fazer o seguinte:

//...
// Esta Query irá retornar a subtração da data atual pela data_geracao.
PreparedStatement pstm = conn.prepareStatement("SELECT NOW() - data_geracao FROM registros WHERE data_geracao >= ?");

// Recupera uma instância de Calendar contendo a data atual.
Calendar calendar = Calendar.getInstance();
// Subtrai 10 minutos da data atual.
calendar.add(Calendar.MINUTE, -10);
// Define o parâmetro da Query com a data especificada.
pstm.setDate(1, new java.sql.Date(calendar.getTimeInMillis()));
//...

Assim você buscaria todos os registros que possuem a data de geração maior ou igual a data que foi passada como parâmetro.
Como não tenho como testar aqui, não sei te dizer exatamente qual o tipo de retorno que esta query irá te trazer, mas acredito que seja um Timestamp mesmo.

Espero ter ajudado!
Abraço

é uma boa solução, contudo tens que cuidar que a data do Banco esteja sincronizada com da aplicação.

É verdade, se a o banco de dados estiver em outra máquina por exemplo pode dar problema…
Para contornar este problema você pode acrescentar um novo parâmetro no lugar do NOW(), que seria um java.sql.Date contendo a data atual da aplicação.

Espero ter ajudado!
Abraço

Criado 18 de outubro de 2010
Ultima resposta 18 de out. de 2010
Respostas 7
Participantes 3