Обсуждение: Doing INTERVAL with NOW() versus casted timestamp
Why does this give me two different results? 'created' is a date field: SELECT * FROM foo WHERE created >= '2013-02-16 00:00:00'::timestamp - INTERVAL '24 hours' and SELECT * FROM foo WHERE created >= NOW() - INTERVAL '24 hours' First returns the 12 rows I expect where the 'created' field is 2012-02-15, second returns only one. Thank you. -- Wells Oliver wellsoliver@gmail.com
Wells Oliver <wellsoliver@gmail.com> wrote:
> Why does this give me two different results? 'created' is a date field:
>
> SELECT * FROM foo WHERE created >= '2013-02-16 00:00:00'::timestamp - INTERVAL
> '24 hours'
test=# select '2013-02-16 00:00:00'::timestamp - INTERVAL '24 hours';
?column?
---------------------
2013-02-15 00:00:00
(1 row)
>
> and
>
> SELECT * FROM foo WHERE created >= NOW() - INTERVAL '24 hours'
test=*# select now() - INTERVAL '24 hours';
?column?
-------------------------------
2013-02-15 16:38:51.362674+01
(1 row)
>
> First returns the 12 rows I expect where the 'created' field is 2012-02-15,
> second returns only one.
You can see the difference?
Andreas
--
Really, I'm not out to destroy Microsoft. That will just be a completely
unintentional side effect. (Linus Torvalds)
"If I was god, I would recompile penguin with --enable-fly." (unknown)
Kaufbach, Saxony, Germany, Europe. N 51.05082°, E 13.56889°
Wells: The now() function returns not only the current date, but the current time. So, now() - 24 hours returns yesterday at this time. But, yesterday at 00:00:00 is not greater than or equal to yesterday at the current time (unless, of course, you happened to run this at precisely 00:00:00 ...). I believe that if you use the current_date function, instead of now(), and subtract 24 hours from that, then you will get the behavior that you expect. Good luck, John On 2/16/2013 7:25 AM, Wells Oliver wrote: > Why does this give me two different results? 'created' is a date field: > > SELECT * FROM foo WHERE created >= '2013-02-16 00:00:00'::timestamp - > INTERVAL '24 hours' > > and > > SELECT * FROM foo WHERE created >= NOW() - INTERVAL '24 hours' > > First returns the 12 rows I expect where the 'created' field is > 2012-02-15, second returns only one. > > Thank you. >
John Shott <shott@stanford.edu> writes:
> I believe that if you use the current_date function, instead of now(),
> and subtract 24 hours from that, then you will get the behavior that you
> expect.
If you're working with dates, rather than timestamps, it's even easier
than that: just add or subtract an integer.
regression=# select current_date;
date
------------
2013-02-16
(1 row)
regression=# select current_date - 1;
?column?
------------
2013-02-15
(1 row)
regards, tom lane