DB2时间戳选择语句

DB2时间戳选择语句,db2,timestamp,Db2,Timestamp,我尝试运行一个简单的查询,根据时间戳获取数据,如下所示: SELECT * FROM <table_name> WHERE id = 1 AND usagetime = timestamp('2012-09-03 08:03:06') WITH UR; 选择* 从…起 其中id=1 和usagetime=时间戳('2012-09-03 08:03:06') 与吾珥; 这似乎不会向我返回记录,而该记录存在于id=1的数据库中 我做错了什么 列usagetime的数据类型正确

我尝试运行一个简单的查询,根据时间戳获取数据,如下所示:

SELECT * 
FROM <table_name> 
WHERE id = 1 
AND usagetime = timestamp('2012-09-03 08:03:06') 
WITH UR;
选择*
从…起
其中id=1
和usagetime=时间戳('2012-09-03 08:03:06')
与吾珥;
这似乎不会向我返回记录,而该记录存在于id=1的数据库中

我做错了什么


列usagetime的数据类型正确,设置为timestamp。

@bhamby正确。如果不使用时间戳值的微秒,则查询将仅在usagetime为2012-09-03 08:03:06.000000时匹配

如果没有从以前的查询中捕获完整的时间戳值,则可以指定一个范围谓词,该谓词将匹配该时间的任何微秒值:

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

…其中id=1和usagetime>='2012-09-03 08:03:06'
和usagetime<'2012-09-03 08:03:07'

在与字符串格式进行比较时,您可能希望在列上使用TRUNC函数,因此它只比较到秒,而不是毫秒

SELECT * FROM <table_name> WHERE id = 1 
AND TRUNC(usagetime, 'SS') = '2012-09-03 08:03:06';

时间戳也有几分之一秒。我猜这是您的问题,我在select语句中没有看到这些。我还想指出,在指定时间戳值的可接受字符串表示形式时,调用TIMESTAMP()是不必要的(您在问题中正确地做了)。请不要在之间使用
,尤其是在处理日期/时间/时间戳时。首先,你的两个
WHERE
子句是不等价的。你是对的。
BETWEEN
条件将包括下一秒,但两次比较将排除下一秒。在
之间使用
的另一个缺点是,至少在较旧版本的DB2中,查询优化器选择的访问计划的效率低于两个显式范围比较。
SELECT * FROM <table_name> WHERE id = 1 
AND TRUNC(usagetime, 'SS') = '2012-09-03 08:03:06';
hour ('HH'), minute('MI'), year('YEAR' or 'YYYY'), month('MONTH' or 'MM'), Day ('DD')