2012-09-03 15 views
5

Estoy tratando de ejecutar una consulta simple, que me pone datos en función de indicación de la hora, de la siguiente manera:Marca de tiempo de DB2 instrucción de selección

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

Esto no parece devolver un registro para mí, mientras que este registro está presente en la base de datos para id = 1.

¿Qué estoy haciendo mal aquí?

El tipo de datos del tiempo de uso de la columna es correcto, configurado con la marca de tiempo.

+2

marcas de tiempo tienen fracciones de segundo, también. Supongo que ese es tu problema, no veo esos en tu declaración seleccionada. – bhamby

Respuesta

17

@bhamby es correcto. Al dejar los microsegundos fuera del valor de su marca de tiempo, su consulta solo coincidiría en un tiempo de uso de 2012-09-03 08: 03: 06.000000

Si no tiene el valor completo de la marca de tiempo capturado de una consulta anterior, puede especificar un predicado a distancia que se ajuste a cualquier valor microsegundo para la época:

...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

También quería señalar que la llamada al TIMESTAMP() es innecesaria al especificar una representación de cadena aceptable de un valor de marca de tiempo (que hizo correctamente en su pregunta). –

+1

Por favor, nunca use 'BETWEEN', especialmente cuando se trata de fecha/hora/marcas de tiempo. Por un lado, sus dos cláusulas 'WHERE' son ** NO ** equivalentes. –

+1

Estás en lo correcto. La condición 'BETWEEN' incluiría el siguiente segundo, pero las dos comparaciones excluirían el siguiente segundo. Otra desventaja del uso de 'BETWEEN' es que, al menos en las versiones anteriores de DB2, se ha sabido que el optimizador de consultas elige un plan de acceso menos eficiente que para las dos comparaciones de rango explícito. –

Cuestiones relacionadas