从带有时区的时间戳中选择匹配日期

时间:2019-10-04 12:05:33

标签: sql postgresql datetime select

我有一个带有“时区”列的时间戳,我想在其中运行一个返回所有匹配日期的查询。例如。我想要所有带有日期为2019-09-30的时间戳的行。我正在尝试类似的方法,但无法弄清楚:

SELECT * FROM table WHERE
x='1277' AND
date='2019-09-30 21:40:01.316240 +00:00'::DATE;

4 个答案:

答案 0 :(得分:2)

有两种选择:

  1. 范围搜索:

    WHERE timestampcol >= TIMESTAMPTZ '2019-09-30'
      AND timestampcol < (TIMESTAMPTZ '2019-09-30' + INTERVAL '1 day')
    

    要使其快速运行的正确索引是

    CREATE INDEX ON atable (timestampcol);
    
  2. 转换为date

    WHERE CAST(timestampcol AS date) = '2019-09-30'
    

    要使其快速运行的正确索引是

    CREATE INDEX ON atable ((CAST(timestampcol AS date)));
    

两种方法都可以很好地工作。第二种方法具有较短的WHERE子句,但是专用索引可能没有其他查询可以受益。

答案 1 :(得分:0)

您可以在日期转换列值和固定日期值之间使用这样的排序规则:

<div class="main">
  <img src="https://via.placeholder.com/300x100" />
</div>

Demo

答案 2 :(得分:0)

我不熟悉PostgreSQL,但是下一页https://www.postgresql.org/docs/9.1/datatype-datetime.html表示存在一个可选的精度值 p ,用于指定精度值。秒字段中保留的小数位数。如何为您的 日期 字段配置数据类型?时间戳列存储为八字节整数还是浮点数?如果是更高版本,则有效的精度限制可能小于6。所有这些信息都在上面的链接页面上。

答案 3 :(得分:0)

如前所述,您有几种选择,并且可能会有所不同,具体取决于名为“ date”的字段的数据类型。

例如,

  1. 将字段更改为日期,返回格式为“ yyyy-mm-dd”:

SELECT * FROM table WHERE x='1277' AND date::DATE='2019-09-30';

“日期”紧随字段名称之后。

  1. 将其转换为char并检索10个字符:

SELECT * FROM table WHERE x='1277' AND LEFT(date::varchar,10)='2019-09-30';

  1. 像以前的一样:

SELECT * FROM table WHERE x='1277' AND to_char(date,'yyyymmdd')='20190930';

还有很多其他的。有关更多特定信息,您必须查看PostgreSQL文档以检查最适合您的文档,或发布更多信息,以便我们可以猜测更多有关您的问题。

https://www.postgresql.org/docs/9.4/functions-datetime.html