PostgreSQL BETWEEN 运算符表现不同

PostgreSQL BETWEEN operator behaving differently

我正在使用 sql 查询来提取已部署解决方案的几天数据

我是按以下方式使用查询的

select column1, column2, column3, column 4 
where <condition 1> AND <condition 2> AND 
      created_timestamp BETWEEN '05-31-2019' AND '06-11-2019'

现在它用于获取所有列的值,并按照预期的条件过滤数据,除了这里有一个转折。它没有获取 6 月第 11 天的数据,该日期作为上限提供。

现在据我所知 between operator 包括所提供范围的两个端点。

更让我困惑的是,它以某种方式包含了 5 月 31st 日期的数据,这是上限。

  1. 我需要知道运算符之间(尤其是在 postgresql 不认为它会改变只是想确认)是否包括范围的端点?

  2. 即使它 includes/excludes 它在两个端点的行为也应该相同 我不理解任何有线索的人的偏见行为?

尝试使用正确的日期文字:

SELECT column1, column2, column3, column4
FROM your_table
WHERE created_timestamp BETWEEN '2019-05-31' AND '2019-06-11';

2019-05-31 采用 ISO 8601 格式,在任何模式下都明确表示 2019 年 5 月 31 日。

您可以详细了解 date/time 类型 here 的规则。

编辑:

之所以没有显示 11-6 月的数据,是因为使用 2011-06-11 作为范围上限与使用 2011-06-11 00:00:00 相同。也就是说,它只包括 6 月 11 日恰好在午夜。为了缓解这种情况,请使用 6 月 12 日作为上限:

SELECT column1, column2, column3, column4
FROM your_table
WHERE created_timestamp >= '2019-05-31' AND created_timestamp < '2019-06-12';

据推测,created_timestamp实际上是date/time格式。因此,比较 date/time 值,而不是字符串:

created_timestamp >= '2019-05-21'::date and
created_timestamp < '2019-06-11'::date

请注意,我将 between 更改为两个不等式。这意味着当 created_timestamp 实际上具有时间分量时,代码的行为符合预期。

如果 created_timestamp 是一个 date/time 值,而不仅仅是一个日期,那么 6 月 11 日午夜后(00:00 时)的所有内容都将在 BETWEEN 之外。所以你也许可以这样做

date_trunc('day', created_timestamp) BETWEEN '2019-05-31' AND '2019-06-11'

正如已经指出的那样,日期应该是 yyyy-mm-dd 格式。正如戈登提到的那样,在这种情况下,他们不需要投射到日期,但他是对的,在某些情况下你确实需要投射到日期,这样做并没有什么坏处。

我假设 created_timestamptimestamp(有或没有时区)。

您使用的文字 06-11-2019 对应于该日期的午夜:

SELECT '06-11-2019'::timestamp with time zone;
      timestamptz       
------------------------
 2019-06-11 00:00:00+02
(1 row)

因此结果不包含 6 月 11 日的数据也就不足为奇了。

有两种前进方式:

  1. 使用第二天和<运算符:

    ... WHERE created_timestamp >= '05-31-2019' AND created_timestamp < '06-12-2019'
    
  2. 将时间戳转换为 date:

    ... WHERE date(created_timestamp) BETWEEN '05-31-2019' AND '06-11-2019'
    

第二个选项不能在 created_timestamp 上使用索引(但它可以在 date(created_timestamp) 上使用索引)。

您的查询取决于 DateStyle 的 PostgreSQL 设置,因此请确保该设置始终符合您的需要。