【问题标题】:PostgreSQL- Filter a date rangePostgreSQL-过滤日期范围
【发布时间】:2013-03-26 22:05:50
【问题描述】:

我是一名 SQL 开发人员,大部分时间都花在 MSSQL 上。 我正在寻找一种更好的方法来过滤 PostgreSQL 数据库中的“没有时区的时间戳”字段。

我正在使用:

Where 
DateField >= '2010-01-01' and 
DateField < '2012-01-01'

但鉴于我不是语法专家,我不得不认为有更好的方法。

有什么建议吗?谢谢。

【问题讨论】:

  • 这到底有什么问题?您可以使用 between 2010-01-01 和 2012-01-01`,但实际上几乎相同。有没有更好的方法来使用 MSSQL(我从未使用过)?
  • @Andre 最好明确指定日期格式。
  • 没关系,就是运行时间长了。我确保该字段上有一个索引,但这比我习惯的时间要长得多。
  • 我从来没有遇到过这样比较日期的问题,而且我通常不会索引我的日期。 @RobS 您是否在处理大量可笑的数据?您是否将一堆表连接在一起?
  • 我继承的一张表。我预计会返回大约 3-4 百万行。

标签: postgresql date-range


【解决方案1】:

您的解决方案很好。不过,如果日期是文字,我更喜欢:

WHERE datefield >= '2010-01-01 00:00:00' 
 AND  datefield <  '2012-01-01 00:00:00'

这执行完全相同,但更易于维护,因为它清楚地表明每个文字“日期”的点是时间戳,而不是日期。例如,假设某个时候有人将您的查询更改为以下内容

    AND  datefield <=  '2012-01-01'

... 期望(并且失败)在查询中包含全天“2012-01-01”。使用后面的语法,意图更清晰,避免了这种混淆。

为了更清楚(也许过于冗长),您可以进行显式转换:

WHERE datefield >= '2010-01-01 00:00:00'::timestamp 
 AND  datefield <  '2012-01-01 00:00:00'::timestamp

出于类似的原因(潜在的数据类型混淆),我不会在这里使用to_date(),也不会使用to_timestamp()(它返回timestamptz)。

顺便说一句,我已经修改了大小写以符合推荐的做法(大写的关键字,小写的标识符)

【讨论】:

  • 您可以使用 BETWEEN 如果您将使用 --your example -- '2010-01-01 00:00:00'::timestamp 作为开始日期时间和 '2010-01-01 24:00:00'::timestamp 作为结束。
【解决方案2】:

对于日期间隔,您可以使用以下内容:

WHERE DateField BETWEEN to_date('2010-01-01','YYYY-MM-DD') 
                    AND to_date('2010-01-02','YYYY-MM-DD')

它更短(你不需要重复DateField),并且有明确的日期格式。

您可以使用 1 小时/天/月/年:

WHERE date_trunc('day',DateField) = to_date('2010-01-01','YYYY-MM-DD')

【讨论】:

  • between&gt;= and &lt; 不同,因为它包括两端。
  • @ClodoaldoNeto 对于时间戳(如问题所述),差异为一毫秒。
【解决方案3】:

只要您的列名是TIMESTAMP 类型并且您的列名不是“时间戳”,您就可以使用BETWEEN 使查询保持简单...

SELECT * FROM table WHERE column BETWEEN '2018-12-30 02:19:34' AND '2018-12-30 02:25:34'

这适用于日期“2018-12-30”和日期时间“2018-12-30 02:19:34”。

【讨论】:

    【解决方案4】:

    我同意 leonbloy 的观点,即使用它会使代码更具可读性和清晰性。

    WHERE datefield >= '2010-01-01 00:00:00'::timestamp 
    AND  datefield <  '2012-01-01 00:00:00'::timestamp
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-18
      • 1970-01-01
      相关资源
      最近更新 更多