目前,我的表格中有一列存储日期和时间。该列的数据类型是 没有时区的时间戳 。因此它具有格式为的值'2011-09-13 11:03:44.537'。
'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')。
0
'2011-09-13 00:00:00.0'
如果timestamp将字段的值强制转换为date,如另一个答案中所建议的,则性能将降低,因为需要将列中的每个单个值都强制转换以进行比较,并且不能使用简单的索引。您将必须在表达式上创建一个特殊索引,如下所示:
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';
您不希望包含在内2011-09-13 00:00,因此请使用<代替<=。出于相同的原因,请 不要BETWEEN在这里使用:
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]会根据您当前的时区设置进行解释。日期部分取决于该设置,该设置通常应能按预期工作。
timestamp [without time zone]