我在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, comparisonformatting函数(例如extract()和to_char())来更改查询。

您必须将查询更改为具有类似

l.createdate::DATE >= '2009-06-07'::DATE
AND l.createdate::DATE < '2009-07-08'::DATE;

或以下替代方法之一(您应该真正接受替代方法)。

10-07 12:37
查看更多