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

Sql 从带有时区列的时间戳中选择匹配日期,sql,postgresql,datetime,select,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; 有两种选择: 范围搜索: WHERE timestampcol >= TIMESTAMPTZ '2019-09-30' AND timestampco

我有一个带有时区列的时间戳,我想在其中运行一个返回所有匹配日期的查询。我希望所有的行都有日期2019-09-30的时间戳。我正在尝试类似的方法,但一直没有弄明白:

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

  • 范围搜索:

    WHERE timestampcol >= TIMESTAMPTZ '2019-09-30'
      AND timestampcol < (TIMESTAMPTZ '2019-09-30' + INTERVAL '1 day')
    
  • 转换为日期:

    WHERE CAST(timestampcol AS date) = '2019-09-30'
    
    使其快速的适当索引是

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

  • 这两种方法同样有效。第二种方法有一个较短的
    WHERE
    子句,但有一个专用索引,其他查询可能无法从中受益。

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

    with tab( x, date ) as
    (
     select 1277, '2019-09-30 21:40:01.316240 +00:00'::timestamp with time zone union all
     select 1278, '2019-09-29 21:40:01.316240 +00:00'::timestamp with time zone  
    )
    select *
      from tab
     where date::date = date'2019-09-30';
    

    我不熟悉postgresql,但下一页指出有一个可选的精度值p,用于指定秒字段中保留的小数位数。如何为日期字段配置数据类型?时间戳列是存储为八字节整数还是浮点数?如果是后者,则有效精度限制可能小于6。所有这些信息都在上面的链接页面上。

    您有几个选项,如前所述,并且可能会根据名为“日期”字段的数据类型而有所不同

    比如说,

  • 将字段改为日期,返回格式“yyyy-mm-dd”:
  • 从表中选择*,其中x='1277'和日期::日期='2019-09-30'

    字段名后面的“日期”

  • 将其转换为字符并检索10个字符:
  • 从x='1277'和左侧(日期::varchar,10)='2019-09-30'的表格中选择*

  • 如前所述:
  • 从表中选择*,其中x='1277'和to_char(日期'yyyymmd')='20190930'

    还有很多其他的。要获得更具体的信息,您必须查看PostgreSQL文档,以检查哪一个文档最适合您,或者发布更多信息,以便我们可以对您的问题进行更多猜测


    我将用3个日期来完成这项工作:以这种方式匹配三个时间戳列。你认为我应该选择哪一种?我会使用第一种形式,因为它是更普遍有用的索引。