运算符之间的PostgreSQL行为不同

运算符之间的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”之间创

我使用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”之间创建了时间戳
现在它用来获取所有列的值,并按预期的条件过滤数据,除了这里有一个扭曲。它没有获取作为上限提供的6月11日的数据

现在据我所知,between操作符包括所提供范围的两个端点

更让我困惑的是,它不知何故包含了5月31日的数据,这是一个上限

  • 我需要知道运算符之间(特别是在postgresql中,不要认为它会改变,只需确认)是否包含范围的端点

  • 即使它包含/排除了这两个端点,它的行为也应该是相同的。我不理解这种有偏见的行为,有人对此有线索吗


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

    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'