小编典典

从时间戳列中选择一个日期范围

sql

目前,我的表格中有一列存储日期和时间。该列的数据类型是 没有时区的时间戳 。因此它具有格式为的值'2011-09-13 11:03:44.537'

我需要检索有关日期的行。如果我使用:

select * from table where mdate >= '2011-09-13 11:03:44.537'
                      and mdate <= '2011-09-12 11:03:44.537'

它将提供介于“ 2011-09-13 11:03:44.537”和“ 2011-09-12 11:03:44.537”之间的值。

但是,如果我要使用:

select * from table where mdate >= '2011-09-13 00:00:00.0'
                      and mdate <= '2011-09-12 00:00:00.0'

没有日期,月份和秒,它不显示任何行。

如何从此表中获取有关日期的值(仅包含日期,忽略小时,分钟和秒)?

即使该列具有带时间戳的日期,我也只需要带日期搜索它们(忽略时间戳或将小时,分钟和秒0设为'2011-09-13 00:00:00.0')。


阅读 177

收藏
2021-04-28

共1个答案

小编典典

如果timestamp将字段的值强制转换为date,如另一个答案中所建议的,则性能将降低,因为需要将列中的每个单个值都强制转换以进行比较,并且不能使用简单的索引。您将必须在表达式上创建一个特殊索引,如下所示:

CREATE INDEX some_idx ON tbl (cast(mdate AS date));

在这种情况下,查询还应简化为:

SELECT * FROM tbl
WHERE  mdate::date = '2011-09-12'::date; -- 2nd cast optional

但是,据我所知,您的问题是查询中的一个简单的错字/想法:
切换了上限和下限 。尝试:

SELECT * FROM tbl
WHERE  mdate **> =** '2011-09- **12** 00:00:00.0'
AND    mdate **< =** '2011-09- **13** 00:00:00.0';

或者,为了简化语法并更精确:

SELECT * FROM tbl
WHERE  mdate >= '2011-09-12 00:00'
AND    mdate <  '2011-09-13 00:00';
  • 无需说明秒和0的分数。
  • 您不希望包含在内2011-09-13 00:00,因此请使用<代替<=。出于相同的原因,请
    不要BETWEEN在这里使用:

    WHERE mdate BETWEEN ‘2011-09-12 00:00’ AND ‘2011-09-13 00:00’

这将包括第二天的00:00。

另请注意,类型列timestamp [without time zone]会根据您当前的时区设置进行解释。日期部分取决于该设置,该设置通常应能按预期工作。

2021-04-28