Currently my table has a column to store date and time. The data type of that column is timestamp without time zone. So it has values in the format '2011-09-13 11:03:44.537'
.
I need to retrieve rows with respect to the date. If I use:
select * from table where mdate >= '2011-09-13 11:03:44.537'
and mdate <= '2011-09-12 11:03:44.537'
it will provide the values which are in between '2011-09-13 11:03:44.537' and '2011-09-12 11:03:44.537'.
But if I am going with:
select * from table where mdate >= '2011-09-13 00:00:00.0'
and mdate <= '2011-09-12 00:00:00.0'
without date, month and seconds, It is not displaying any rows.
How to fetch values from this table with respect to the date (only with date, ignoring hour, minutes and seconds)?
Even, the column has date with timestamp, I need to search them only with date (ignoring timestamp or making the hour, minutes and seconds to 0
such as '2011-09-13 00:00:00.0'
).
If you are going to cast the
timestamp
values of the field todate
, as suggested in another answer, performance will degrade because every single value in the column needs to be cast for comparison and simple indexes cannot be used. You would have to create a special index on the expression, like so:In this case the query should also be simplified to:
However, as far as I can see, your problem is a simple typo / thinko in your query:
You switched upper & lower boundaries. Try:
Or, to simplify your syntax and be more precise:
You don't want to include
2011-09-13 00:00
, so use<
instead of<=
.Don't use
BETWEEN
here, for the same reason:This would include 00:00 of the next day.
Also be aware that a column of type
timestamp [without time zone]
is interpreted according to your current time zone setting. The date part depends on that setting, which should generally work as expected. More details:Ignoring timezones altogether in Rails and PostgreSQL
Just treat the timestamp as a date:
The expression
mdate::date
will cast the timestamp to adate
type which will remove the time part from the value.DATE '2011-09-13'
is a (standard) DATE literal which is a bit more robust than simply writing '2011-09-13' as it isn't affected by any language settings.