2012-09-03 16 views
5

Sto cercando di eseguire una semplice domanda che mi viene dati in base a data e ora, come segue:DB2 timestamp select

SELECT * 
FROM <table_name> 
WHERE id = 1 
AND usagetime = timestamp('2012-09-03 08:03:06') 
WITH UR; 

Questo non sembra di tornare un record per me, che questo record è presente in il database per id = 1.

Cosa sto facendo di sbagliato qui?

Il tipo di dati della colonna usagetime è corretto, impostato su data/ora.

+2

Timestamps hanno frazioni di secondo, pure. Immagino che questo sia il tuo problema, non vedo quelli nella tua dichiarazione prescelta. – bhamby

risposta

17

@bhamby è corretto. Abbandonando i microsecondi del tuo valore di timestamp, la tua query verrebbe abbinata solo in un usagetime del 2012-09-03 08: 03: 06,000000

Se non hai il valore di timestamp completo acquisito da una query precedente, può specificare un predicato spaziato che corrisponderà a qualsiasi valore microsecondi per quel tempo:

...WHERE id = 1 AND usagetime BETWEEN '2012-09-03 08:03:06' AND '2012-09-03 08:03:07' 

o

...WHERE id = 1 AND usagetime >= '2012-09-03 08:03:06' 
    AND usagetime < '2012-09-03 08:03:07' 
+1

Desidero anche sottolineare che la chiamata a TIMESTAMP() non è necessaria quando si specifica una rappresentazione di stringa accettabile di un valore di timestamp (che è stato eseguito correttamente nella domanda). –

+1

Non utilizzare mai "BETWEEN", specialmente quando si tratta di data/ora/data/ora. Per prima cosa, le tue due clausole 'WHERE' sono ** NON ** equivalenti. –

+1

Hai ragione. La condizione "BETWEEN" includerebbe il secondo seguente, ma i due confronti escluderebbero il secondo successivo. Un altro svantaggio dell'uso di "BETWEEN" è che, almeno nelle versioni precedenti di DB2, è noto che Query Optimizer sceglie un piano di accesso meno efficiente rispetto ai due confronti a intervalli espliciti. –