运算符之间的PostgreSQL行为不同
我使用sql查询来提取部署解决方案的几天数据 我以下面的方式使用这个查询运算符之间的PostgreSQL行为不同,sql,postgresql,between,Sql,Postgresql,Between,我使用sql查询来提取部署解决方案的几天数据 我以下面的方式使用这个查询 select column1, column2, column3, column 4 where <condition 1> AND <condition 2> AND created_timestamp BETWEEN '05-31-2019' AND '06-11-2019' 选择第1列、第2列、第3列和第4列 在哪里 在“05-31-2019”和“06-11-2019”之间创
select column1, column2, column3, column 4
where <condition 1> AND <condition 2> AND
created_timestamp BETWEEN '05-31-2019' AND '06-11-2019'
选择第1列、第2列、第3列和第4列
在哪里
在“05-31-2019”和“06-11-2019”之间创建了时间戳
现在它用来获取所有列的值,并按预期的条件过滤数据,除了这里有一个扭曲。它没有获取作为上限提供的6月11日的数据
现在据我所知,between操作符包括所提供范围的两个端点
更让我困惑的是,它不知何故包含了5月31日的数据,这是一个上限
尝试使用正确的日期文字:
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日
您可以阅读有关日期/时间类型规则的更多信息
编辑:
6月11日的数据未显示的原因是使用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';
选择第1列、第2列、第3列和第4列
从你的桌子上
其中创建的时间戳>='2019-05-31'和创建的时间戳<'2019-06-12';
据推测,创建的时间戳实际上是日期/时间格式。因此,比较日期/时间值,而不是字符串:
created_timestamp >= '2019-05-21'::date and
created_timestamp < '2019-06-11'::date
created_timestamp>=“2019-05-21”::日期和
创建时间戳<'2019-06-11':日期
请注意,我将
之间的更改为两个不等式。这意味着当创建的时间戳实际上有一个时间成分时,代码的行为与预期的一样。如果创建的时间戳是一个日期/时间值,而不仅仅是一个日期,那么6月11日午夜(00:00小时)之后的所有内容都将超出时间间隔。所以你也许可以这样做
date_trunc('day', created_timestamp) BETWEEN '2019-05-31' AND '2019-06-11'
如前所述,日期应为yyyy-mm-dd格式。正如Gordon提到的,在这种情况下,它们不需要按日期进行转换,但他说得对,在某些情况下,您确实需要按日期进行转换,这样做并没有什么坏处。我假设创建的时间戳是时间戳(带时区或不带时区)
您所使用的文字,06-11-2019
,对应于该日期的午夜:
SELECT '06-11-2019'::timestamp with time zone;
timestamptz
------------------------
2019-06-11 00:00:00+02
(1 row)
因此,结果不包括6月11日的数据也就不足为奇了
前进有两条路:
使用第二天和,但是PostgreSQL可以将字符串文本(类型未知
)转换为时间戳
。是的,你是对的,它是一个时间戳(没有时区),所以你的意思是说'BETWEEN'操作符基本上会转换为这个05-31-2019 00:00:00.00=06-11-2019 00:00:00.00是这样吗?本质上是的,除非你把不平等符号弄错了-应该是啊,是的,我没看到,谢谢!!感谢您澄清困惑,这真的很有帮助:)
... WHERE created_timestamp >= '05-31-2019' AND created_timestamp < '06-12-2019'
... WHERE date(created_timestamp) BETWEEN '05-31-2019' AND '06-11-2019'