DB2时间戳选择语句

9

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

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

这似乎对我没有返回任何记录,而该记录在数据库中具有id = 1。

我在这里做错了什么?

列usagetime的数据类型是正确的,并设置为时间戳。


2
时间戳也包含毫秒,我猜这可能是你的问题,因为在你的选择语句中我没有看到它们。 - bhamby
2个回答

23

@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'
或者
...WHERE id = 1 AND usagetime >= '2012-09-03 08:03:06' 
   AND usagetime < '2012-09-03 08:03:07'

1
我还想指出,当指定时间戳值的可接受字符串表示形式时(您在问题中正确地执行了此操作),调用TIMESTAMP()是不必要的。 - Fred Sobotka
1
请勿使用 BETWEEN,特别是在处理日期/时间戳时。首先,您的两个 WHERE 子句不相等 - Clockwork-Muse
1
你是正确的。BETWEEN 条件将包括以下秒数,但两个比较将排除以下秒数。使用 BETWEEN 的另一个缺点是,在旧版本的 DB2 中,查询优化器已知会选择比两个显式范围比较更低效的访问计划。 - Fred Sobotka

2

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

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

如果您想截断到分钟、小时等,也是可以的,只需使用适当的符号代替“SS”即可:
hour ('HH'), minute('MI'), year('YEAR' or 'YYYY'), month('MONTH' or 'MM'), Day ('DD')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接