0

我正在尝试编写一个查询来获取特定日期的表的所有行。

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 上运行。

有什么建议么?

4

4 回答 4

3

你可以做:

select *
from MY_Table
where trunc(COLUMN_CONTAINING_DATE) = '2013-05-07';

但是,您描述为“hack”的版本实际上更好。通过围绕数据包装函数,许多 SQL 优化器将不使用索引。如果只是直接比较,肯定会使用索引。

于 2013-05-22T17:00:42.110 回答
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 子句的格式,因为如果您必须在两个月后查看查询,这将大大提高可读性。只需为“a <= x < b”之类的范围选择您喜欢的样式。不幸的是,SQL之间不支持这一点。

有人可能会争辩说仍然缺少毫秒,所以完美主义者可能会在时间戳中附加另一个“.0”......

于 2013-05-25T12:58:26.843 回答
0

使用这样的东西

SELECT * FROM MY_TABLE WHERE COLUMN_CONTAINING_DATE=DATE('2013-05-07')
于 2013-05-23T08:35:12.187 回答
0

如果您使用 DB2 10.1 中的 Temporal 数据管理功能,您可以轻松解决这个问题。

更多信息: http ://www.ibm.com/developerworks/data/library/techarticle/dm-1204db2temporaldata/

于 2013-05-23T16:27:14.313 回答