Я думал, для именно это >>
был оператор на строковых потоках:
string word; sin >> word;
Явным решением вашей проблемы является преобразование даты и времени в строку.
..., SUBSTRING (l.createdate :: varchar, ...
Использование результата для сравнения дат - не лучшая практика.
Итак, хорошее решение для вашей потребности - это изменить ваш запрос с помощью явного datetime функции манипулирования, сравнения и форматирования , такие как extract () и to_char ()
Вам нужно будет изменить свой запрос, чтобы он содержал предложение вроде
l.createdate::DATE >= '2009-06-07'::DATE
AND l.createdate::DATE < '2009-07-08'::DATE;
или одну из альтернатив ниже ( что вам действительно стоит принять вместо этого.)
SELECT u.username, l.description, l.ip,
CAST(l.createdate AS DATE) as createdate,
l.action
FROM n_logs AS l
LEFT JOIN
n_users AS u
ON u.id = l.userid
WHERE l.createdate >= '2009-06-07'::TIMESTAMP
AND l.createdate < '2009-07-07'::TIMESTAMP + '1 DAY'::INTERVAL
I'm not sure what you want to achieve, but basically "substring" on date datatypes is not really well defined, as it depends on external format of said data.
In most of the cases you should use extract() or to_char() functions.
Generally - for returning data you want to_char(), and for operations on it (including comparison) - extract(). There are some cases where this general rule does not apply, but these are usually signs of not really well thought data-structure.
Example:
# select to_char( now(), 'YYYY-MM-DD');
to_char
------------
2009-07-07
(1 row)
For extract let's write a simple query that will list all objects created after 8pm:
select * from objects where extract(hour from created) >= 20;
Вариант ответа Квассного:
SELECT
u.username,
l.description,
l.ip,
CAST(l.createdate AS DATE) as createdate,
l.action
FROM
n_logs AS l
LEFT JOIN
n_users AS u
ON
(u.id = l.userid)
WHERE
l.createdate::DATE BETWEEN '2009-06-07'::DATE AND '2009-07-07'::DATE