Strange behavior between timestamp and date comparison

Started by Ludwig Isaac Limover 3 years ago3 messagesgeneral
Jump to latest
#1Ludwig Isaac Lim
ludz_lim@yahoo.com

Hello:

Below is a sample case that exhibits a behavior that I can't explain:

-- create the table
create table ts (t timestamp without time zone);

-- populate
insert into ts(t) values ('2022-07-16 00:22:06.974000');
insert into ts(t) values ('2022-07-16 00:22:06.974000');
insert into ts(t) values ('2022-07-16 00:22:06.974000');

-- This one return expected results
select * from ts where t::date between '2022-07-16'::Date - make_interval(days => 30) and '2022-07-16'::Date;
            t
-------------------------
 2022-07-16 00:22:06.974
 2022-07-16 00:22:06.974
 2022-07-16 00:22:06.974
(3 rows)

-- This one doesn't return anything (unexpected)
 select * from ts where t between '2022-07-16'::Date - make_interval(days => 30) and '2022-07-16'::Date;
 t
---
(0 rows)

-- version
select version();
                                                 version
---------------------------------------------------------------------------------------------------------
 PostgreSQL 14.4 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 7.3.1 20180712 (Red Hat 7.3.1-15), 64-bit
(1 row)

Regards,
Ludwig Lim

#2Rory Campbell-Lange
rory@campbell-lange.net
In reply to: Ludwig Isaac Lim (#1)
Re: Strange behavior between timestamp and date comparison

On 23/07/22, Ludwig Isaac Lim (ludz_lim@yahoo.com) wrote:

Below is a sample case that exhibits a behavior that I can't explain:

-- create the table
create table ts (t timestamp without time zone);

-- populate
insert into ts(t) values ('2022-07-16 00:22:06.974000');
insert into ts(t) values ('2022-07-16 00:22:06.974000');
insert into ts(t) values ('2022-07-16 00:22:06.974000');

-- This one doesn't return anything (unexpected)
�select * from ts where t between '2022-07-16'::Date - make_interval(days => 30) and '2022-07-16'::Date;

It looks like all of your timestamps are outside of the upper bound of "between".

template1=> select ('2022-07-16'::Date)::timestamp;
timestamp
---------------------
2022-07-16 00:00:00

#3Adrian Klaver
adrian.klaver@aklaver.com
In reply to: Ludwig Isaac Lim (#1)
Re: Strange behavior between timestamp and date comparison

On 7/23/22 03:04, Ludwig Isaac Lim wrote:

Hello:

Below is a sample case that exhibits a behavior that I can't explain:

-- create the table
create table ts (t timestamp without time zone);

-- populate
insert into ts(t) values ('2022-07-16 00:22:06.974000');
insert into ts(t) values ('2022-07-16 00:22:06.974000');
insert into ts(t) values ('2022-07-16 00:22:06.974000');

-- This one return expected results
select * from ts where t::date between '2022-07-16'::Date - make_interval(days => 30) and '2022-07-16'::Date;
            t
-------------------------
 2022-07-16 00:22:06.974
 2022-07-16 00:22:06.974
 2022-07-16 00:22:06.974
(3 rows)

-- This one doesn't return anything (unexpected)
 select * from ts where t between '2022-07-16'::Date - make_interval(days => 30) and '2022-07-16'::Date;
 t
---
(0 rows)

Because:

select '2022-07-16 00:22:06.974'::date;
date
------------
2022-07-16

select '2022-07-16 00:22:06.974'::timestamp;
timestamp
-------------------------
2022-07-16 00:22:06.974

and:

select '2022-07-16'::date::timestamp;
timestamp
---------------------
2022-07-16 00:00:00

When you normalize all the values to a date it works e.g. t::date.

When you don't then the date values in the between get compared as
timestamps and 2022-07-16 00:22:06.974 is greater then 2022-07-16 00:00:00

-- version
select version();
                                                 version
---------------------------------------------------------------------------------------------------------
 PostgreSQL 14.4 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 7.3.1 20180712 (Red Hat 7.3.1-15), 64-bit
(1 row)

Regards,
Ludwig Lim

--
Adrian Klaver
adrian.klaver@aklaver.com