2010-03-30 17 views
6

Una tabla tiene una columna timestamp. Un valor de muestra en eso podría ser 2010-03-30 13:42:42. Con Hibernate, estoy haciendo una consulta de rango Restrictions.between ("column-name", fromDate, toDate).Consulta de fecha con Hibernate en Timestamp Columna en PostgreSQL

El mapeo de Hibernate para esta columna es el siguiente.

<property name="orderTimestamp" column="order_timestamp" type="java.util.Date" /> 

Digamos, yo quiero averiguar todos los registros que tienen la fecha 30ma marzo de 2010 y marzo de 2010. 31a Una consulta rango en este campo se realiza de la siguiente manera.

Date fromDate = new SimpleDateFormat("yyyy-MM-dd").parse("2010-03-30"); 
Date toDate = new SimpleDateFormat("yyyy-MM-dd").parse("2008-03-31"); 
Expression.between("orderTimestamp", fromDate, toDate); 

Esto no funciona.

La consulta se convierte a marcas de tiempo respectivas como "2010-03-30 00:00:00" y "2010-03-31 00:00:00". Entonces, todos los registros para el 31 de marzo de 2010 son ignorados.

Una solución simple a este problema podría ser tener la fecha de finalización como "2010-03-31 23:59:59". Pero me gustaría saber si hay forma de hacer coincidir solo la parte de la fecha de la columna de la marca de tiempo.

Además, ¿el Expression.between() incluye ambos límites? La documentación no arroja ninguna luz sobre esto.

+0

Creo que siempre es exclusivo en ambos extremos. ¿Por qué no eliminas 1 milisegundo y agregas 1 milisegundo a cada uno de ellos? – jishi

+3

@jishi depende de la base de datos (y la mayoría de las veces inclusive, creo). –

+0

Shashikant ¿podría resolver esto? – changeme

Respuesta

1

El "2010-03-31 23:59:59." La condición del borde es potencialmente peligrosa: si hubo una transacción en el sistema entre las 23:59:59 y 00:00:00, la extrañaría. Si tiene suficientes transacciones diarias y un período suficientemente largo, un informe se va a romper y pasará horas para descubrir por qué.

PostgreSQL betweenincludes the limits por lo que ni siquiera sería seguro establecer la fecha de finalización para 2010-04-01 00:00:00. Use lt() y gt() para estar seguro.

+0

todavía que no volaría, que incluirá 2010-04-01 00:00 AM –

+0

Usando lt ("endDate", endDate) donde endDate = "2010-04-01 00:00" incluiría registros con fecha de finalización 2010 -04-01 00:00? No creo que ese sea el caso. –

+0

Gracias por el enlace para que 'entre' sea inclusivo para PostgreSQL. Las condiciones de contorno no son una gran preocupación ya que las marcas de tiempo se registran solo con la precisión de segundos. Para usar, menor que o mayor que, necesito usar menos de ("2010-04-01 00:00:00") y mayor que o igual que ("2010-03-30 00 : 00: 00 ") –

3

, me gustaría saber si hay manera de hacer coincidir solo la parte de la fecha de la columna de marca de tiempo.

Si no quiere un TIMESTAMP, use una FECHA (¿y no debería usar type="date"?).

Además, ¿Expression.between() incluye ambos límites?

Parece que el comportamiento del operador SQL BETWEEN es database dependent. Con PosgreSQL, la entre la expresión:

x BETWEEN y AND z 

es semánticamente equivalente a:

y <= x AND x <= z 

es decir, inclusive.

+0

tipo =" fecha "no ayuda. Desea probar su idea anterior de anotación, pero desafortunadamente, estoy en la versión de Hibernate anterior a 3.3 en la que se introdujeron las anotaciones. –

+0

@Shashikant Publiqué mi respuesta demasiado rápido, no me di cuenta de que estaba usando asignaciones de xml (de ahí la actualización). Pero, de hecho, las anotaciones de Hibernate tienen una anotación @Temporal para esto (http://docs.jboss.org/hibernate/stable/annotations/reference/en/html_single/#d0e342). Debe haber algún tipo de equivalente con xml ... ¿Tienes control sobre tu modelo físico por cierto? –

+0

Excepto el esquema DB (es decir, columna timstamp) y la versión Hibernate, puedo cambiar todo lo demás. La anotación temporal parece útil, pero como mencioné, no puedo moverme a Hibernate 3.3+. Además, si agrego la anulación temporal como fecha, al recuperar la fila, ¿truncará la marca de tiempo hasta la fecha? Si es así, eso es indeseable. Gracias por la ayuda, Pascal. Modding +1. –

0

Use cast (your_data, date), recuerde que el segundo arg de la función de cast debe ser menor, o no funcionará.

Att .: Samuel \ Maycon

Cuestiones relacionadas