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 日期的数据,这是上限。
我需要知道运算符之间(尤其是在 postgresql 不认为它会改变只是想确认)是否包括范围的端点?
即使它 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_timestamp
是 timestamp
(有或没有时区)。
您使用的文字 06-11-2019
对应于该日期的午夜:
SELECT '06-11-2019'::timestamp with time zone;
timestamptz
------------------------
2019-06-11 00:00:00+02
(1 row)
因此结果不包含 6 月 11 日的数据也就不足为奇了。
有两种前进方式:
使用第二天和<
运算符:
... WHERE created_timestamp >= '05-31-2019' AND created_timestamp < '06-12-2019'
将时间戳转换为 date
:
... WHERE date(created_timestamp) BETWEEN '05-31-2019' AND '06-11-2019'
第二个选项不能在 created_timestamp
上使用索引(但它可以在 date(created_timestamp)
上使用索引)。
您的查询取决于 DateStyle
的 PostgreSQL 设置,因此请确保该设置始终符合您的需要。
我正在使用 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 日期的数据,这是上限。
我需要知道运算符之间(尤其是在 postgresql 不认为它会改变只是想确认)是否包括范围的端点?
即使它 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_timestamp
是 timestamp
(有或没有时区)。
您使用的文字 06-11-2019
对应于该日期的午夜:
SELECT '06-11-2019'::timestamp with time zone;
timestamptz
------------------------
2019-06-11 00:00:00+02
(1 row)
因此结果不包含 6 月 11 日的数据也就不足为奇了。
有两种前进方式:
使用第二天和
<
运算符:... WHERE created_timestamp >= '05-31-2019' AND created_timestamp < '06-12-2019'
将时间戳转换为
date
:... WHERE date(created_timestamp) BETWEEN '05-31-2019' AND '06-11-2019'
第二个选项不能在 created_timestamp
上使用索引(但它可以在 date(created_timestamp)
上使用索引)。
您的查询取决于 DateStyle
的 PostgreSQL 设置,因此请确保该设置始终符合您的需要。