我在postgres中的以下查询有问题
SELECT u.username,l.description,l.ip,SUBSTRING(l.createdate,0,11) as createdate,l.action
FROM n_logs AS l LEFT JOIN n_users AS u ON u.id = l.userid
WHERE SUBSTRING(l.createdate,0,11) >= '2009-06-07'
AND SUBSTRING(l.createdate,0,11) <= '2009-07-07';
我总是在较旧的postgres版本中使用上述查询,并且可以100%使用。现在有了新版本的posgres,它给了我类似下面的错误
**ERROR: function pg_catalog.substring(timestamp without time zone, integer, integer) does not exist
LINE 1: SELECT u.username,l.description,l.ip,SUBSTRING(l.createdate,...
^
HINT: No function matches the given name and argument types. You might need to add explicit type casts.**
我假设它与数据类型有关,该数据是一个时区,并且子字符串仅支持字符串数据类型,现在我的问题是我该如何处理我的查询,以便得出结果?
最佳答案
对于您的问题的显式解决方案是将datetime强制转换为字符串。
...,SUBSTRING(l.createdate::varchar,...
现在,将结果用于比较日期根本不是一个好习惯。
因此,满足您需求的一个好的解决方案是使用显式的datetime manipulation, comparison和formatting函数(例如extract()和to_char())来更改查询。
您必须将查询更改为具有类似
l.createdate::DATE >= '2009-06-07'::DATE
AND l.createdate::DATE < '2009-07-08'::DATE;
或以下替代方法之一(您应该真正接受替代方法)。