当前位置: 首页 > 面试题库 >

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

鱼宜
2023-03-14
问题内容

目前,我的表格中有一列存储日期和时间。该列的数据类型是 没有时区的时间戳 。因此它具有格式为的值'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')。


问题答案:

如果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]会根据您当前的时区设置进行解释。日期部分取决于该设置,该设置通常应能按预期工作。



 类似资料:
  • 问题内容: 我有一个类型为“ datetime”的列,其值类似于2009-10-20 10:00:00 我想从datetime提取日期并编写类似的查询: 以下是最好的方法吗? 但是,这将返回一个空的结果集。有什么建议么? 问题答案: 您可以使用MySQL的功能: 您也可以尝试以下方法: 有关使用的性能影响的信息,请参见此答案。

  • 问题内容: 我有以下数据: 我正在尝试编写一个查询,该查询选择与某个日期匹配的所有记录,但是我正在为该字段使用时间戳记,无论我如何尝试,我的查询都不会产生任何结果。 SQL :我尝试了以下查询,但没有任何结果 1。 2。 3。 仅当我将整个日期值设置为时,它才起作用; 问题答案: 尼古拉斯·克拉斯诺夫(Nicholas Krasnov)提供的答案

  • 问题内容: 如何在MySQL中的日期范围之间选择数据。我的专栏是24小时的祖鲁时间格式。 尽管在这些时间段之间有数据,但不返回任何内容。我是否必须强制 “发件人” 和 “发件人” 字段中的值键入查询? 问题答案: 您需要更新日期格式:

  • 问题内容: 如何从PostgreSQL的时间戳获取最多只有几分钟而不是几秒钟的日期和时间。我需要日期和时间。 例如: 为此,我需要 从带有时区的时间戳字段中说出,如何使用PostgreSQL select查询获取日期和时间。 请帮我。 问题答案: postgresql有很多可用的日期时间函数: 在这里查看清单 http://www.postgresql.org/docs/9.1/static/fu

  • 我通过连接单独的月、日、年和时间列创建了日期列,但是月和日列的输入数据形式为1,而不是01表示月和日。这是我返回空列的原因吗?还是有其他原因?如果这就是原因,那么如何将日和月列从1改为01、2改为02、…? 这是我第一次使用时间戳,而且我是Scala新手,所以我非常感谢您的帮助。

  • 我试图获得一个SQL语句来选择时间戳在两个给定时间戳之间的行。这是我试过的。(这是在Java servlet上,而我是Java时间戳对象。) 这里的from和to是timestamp对象这给了我一个语法错误,当我试图准备语句时,请帮助