2010-03-30 15 views
6

Una tabella ha una colonna data/ora. Un valore di esempio potrebbe essere 2010-03-30 13:42:42. Con Hibernate, eseguo una query di intervallo Restrictions.between ("column-name", fromDate, toDate).Query di date con Hibernate nella colonna Timestamp in PostgreSQL

La mappatura Hibernate per questa colonna è la seguente.

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

Diciamo, voglio scoprire tutti i record che hanno la data 30 marzo 2010 e il 31 marzo 2010. Una query gamma in questo campo viene fatto come segue.

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); 

Questo non funziona.

La query viene convertita in data e ora come "2010-03-30 00:00:00" e "2010-03-31 00:00:00". Pertanto, tutti i record per il 31 marzo 2010 vengono ignorati.

Una soluzione semplice a questo problema potrebbe essere la data di fine "2010-03-31 23:59:59". Ma vorrei sapere se esiste un modo per associare solo la parte della data della colonna timestamp.

Inoltre, è Expression.between() comprensivo di entrambi i limiti? La documentazione non getta alcuna luce su questo.

+0

Credo che tra sempre sia esclusivo su entrambi i limiti. Perché non rimuovi solo 1 millisecondo e aggiungi 1 millisecondo a ciascuno di essi? – jishi

+3

@jishi dipende dal database (e credo che la maggior parte del tempo includa). –

+0

Shashikant potresti risolvere questo? – changeme

risposta

1

"2010-03-31 23:59:59". la condizione di confine è potenzialmente pericolosa: se ci fosse una transazione nel sistema tra le 23:59:59 e le 00:00:00, ti mancherebbe. Se hai abbastanza transazioni al giorno e un periodo abbastanza lungo, un rapporto si interromperà e passerai ore a scoprire perché.

PostgreSQL betweenincludes the limits quindi non sarebbe nemmeno sicuro impostare la data di fine 2010-04-01 00:00:00. Usa lt() e gt() per essere sicuro.

+0

ancora che non volerebbe, che includerà 2010-04-01 00:00 AM –

+0

Utilizzo di lt ("endDate", endDate) dove endDate = "2010-04-01 00:00" includerebbe record con data di fine 2010 -04-01 00:00? Non penso sia così. –

+0

Grazie per il collegamento tra "compreso" per PostgreSQL. Le condizioni al contorno non sono un problema, poiché i timestamp vengono registrati solo per la precisione dei secondi. Per utilizzare, minore o maggiore di, ho bisogno di usare meno di ("2010-04-01 00:00:00") e maggiore di-o-uguale a ("2010-03-30 00 : 00: 00 ") –

3

, vorrei sapere se c'è modo di associare solo la parte della data della colonna timestamp.

Se non si desidera un TIMESTAMP, utilizzare una DATA (e non si dovrebbe usare type="date"?).

Inoltre, è Expression.between() comprensivo di entrambi i limiti?

Sembra che il comportamento dell'operatore SQL BETWEEN sia database dependent. Con PosgreSQL, l'TRA espressione:

x BETWEEN y AND z 

è semanticamente equivalente a:

y <= x AND x <= z 

cioè compreso.

+0

type =" date "non aiuta. Vuoi provare la tua prima idea di annotazione, ma sfortunatamente sono nella versione di Hibernate più vecchia di 3.3 in cui sono state introdotte le annotazioni. –

+0

@Shashikant Ho postato la mia risposta un po 'troppo velocemente, non ho capito che stavi usando i mapping xml (da qui l'aggiornamento). Ma in effetti, le annotazioni Hibernate hanno un'annotazione @Temporal per questo (http://docs.jboss.org/hibernate/stable/annotations/reference/en/html_single/#d0e342). Ci deve essere un qualche tipo di equivalente con xml ... Hai il controllo sul tuo modello fisico BTW? –

+0

Tranne lo schema DB (cioè la colonna timstamp) e la versione Hibernate, posso cambiare tutto il resto. L'annotazione temporale sembra utile ma, come ho detto, non posso passare a Hibernate 3.3+. Inoltre, se aggiungo l'annunziamento temporale come data, mentre recuperi la riga, troncherà la data e l'ora? Se sì, è indesiderabile. Grazie per l'aiuto, Pascal. Modding +1. –

0

Usa cast (your_data, date), ricorda che il secondo arg della funzione cast deve essere inferiore, altrimenti non funzionerà.

Att .: Samuel \ Maycon

Problemi correlati