【问题标题】:How do I match an entire day to a datetime field?如何将一整天与日期时间字段匹配?
【发布时间】:2012-02-08 14:55:42
【问题描述】:

我有一张火柴桌。该表有一个名为matchdate 的列,它是一个datetime 字段。

如果我在 2011 年 12 月 1 日有 3 场比赛:

  • 2011-12-01 12:00:00
  • 2011-12-01 13:25:00
  • 2011-12-01 16:00:00

我该如何查询?如何查询 1 个日期的所有匹配项?

我看过date_trunc()to_char()等。
不是有一些"select * where datetime in date" 功能吗?

【问题讨论】:

    标签: ruby-on-rails-3 postgresql datetime select timestamp


    【解决方案1】:

    如果您想要简单的语法,请将您的 timestamp 值转换为 date。像这样:

    SELECT *
    FROM   tbl
    WHERE  timestamp_col::date = '2011-12-01';  -- date literal
    

    但是,使用大表会更快:

    SELECT *
    FROM   tbl
    WHERE  timestamp_col >= '2011-12-01 0:0'    -- timestamp literal
    AND    timestamp_col <  '2011-12-02 0:0';
    

    原因:第二个查询不必转换表中的每个值,并且可以利用时间戳列上的简单索引。表达式为sargable

    注意排除了正确选择的上限(&lt; 而不是&lt;=)。
    您可以通过像这样创建index on an expression 来弥补这一点:

    CREATE INDEX tbl_ts_date_idx ON tbl (cast(timestamp_col AS date));
    

    那么第一个版本的查询将尽可能快。

    【讨论】:

    • 您可以让 Rails 使用 .where(:date =&gt; '2011-12-01' ... '2011-12-02') 生成半开的 [2011-12-01, 2011-12-02) 版本,2 点范围将使用 [2011-12-01, 2011-12-02] 和 BETWEEN。当使用 &gt;=&lt; 时,PostgreSQL 是否也会将所有内容都转换为日期,或者它是否足够聪明地知道将文字转换为时间戳会产生相同的效果并且工作量更少?
    • @muistooshort:在这种情况下,Postgres 足够聪明。这将导致我的第二个查询。
    【解决方案2】:

    不确定我是否在这里遗漏了一些明显的东西,但我认为你可以

    select * from table where date_trunc('day', ts) = '2011-12-01';
    

    【讨论】:

      【解决方案3】:

      只需像这样使用 SQL BETWEEN 函数:

      SELECT * FROM table WHERE date BETWEEN '2011-12-01' AND '2011-12-02'
      

      您可能需要在日期文字中包含时间,但这应该包括情人限制并排除上限。

      我相信你可以从 rails 做到:

      .where(:between => '2011-12-01'..'2011-12-02')
      

      【讨论】:

      • 你想要.where(:date =&gt; '2011-12-01' ... '2011-12-02'): :date 而不是:between 和一个三点范围来处理半开[2011-12-01, 2011-12-02) 区间而不是完全闭区间[2011-12-01, 2011-12-02] 区间. .. 确实在 SQL 中作为 BETWEEN 结束,... 最终使用 &gt;=/&lt; 对。
      猜你喜欢
      • 1970-01-01
      • 2015-04-30
      • 1970-01-01
      • 2021-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-15
      • 1970-01-01
      相关资源
      最近更新 更多