我正在尝试编写一个查询,该查询获取特定日期的表的所有行。
SELECT * FROM MY_TABLE WHERE COLUMN_CONTAINING_DATE='2013-05-07'
但是这不起作用,因为在表格中COLUMN_CONTAINING_DATE包含类似'2013-05-07 00:00:01'等数据。所以,这样可行
SELECT * FROM MY_TABLE WHERE COLUMN_CONTAINING_DATE>='2013-05-07' AND COLUMN_CONTAINING_DATE<'2013-05-08'
然而,我不想选择2,因为这感觉就像一个hacky方式。我宁愿把一个查询说给我一个给定日期的所有行,并且不知道怎么不打扰COLUMN_CONTAINING_DATE中的分钟和小时。
我正在尝试在H2和DB2上运行此查询。
有什么建议吗?
答案 0 :(得分:3)
你可以这样做:
select *
from MY_Table
where trunc(COLUMN_CONTAINING_DATE) = '2013-05-07';
但是,您描述为“hack”的版本实际上更好。通过在数据周围包装函数,许多SQL优化器将不使用索引。只需直接比较,肯定会使用索引。
答案 1 :(得分:0)
使用类似的东西
SELECT * FROM MY_TABLE WHERE COLUMN_CONTAINING_DATE=DATE('2013-05-07')
答案 2 :(得分:0)
如果您使用DB2 10.1中的Temporal数据管理功能,则可以简化此操作。
了解更多信息: http://www.ibm.com/developerworks/data/library/techarticle/dm-1204db2temporaldata/
答案 3 :(得分:0)
如果您的顾虑与不同的数据类型(列中的时间戳和包含日期的字符串)相关,您可以这样做:
SELECT * FROM MY_TABLE
WHERE
COLUMN_CONTAINING_DATE >= '2013-05-07 00:00:00'
and COLUMN_CONTAINING_DATE < '2013-05-08 00:00:00'
并且我注意where子句的格式,因为如果你必须在两个月后查看你的查询,这将大大提高可读性。只需选择您喜欢的样式,例如&#34; a&lt; = x&lt; B&#34 ;.不幸的是,SQL 之间的不支持此功能。
有人可能会说毫秒仍然缺失,所以完美主义者可能会追加另一个&#34; .0&#34;在时间戳...