postgresql – SUBSTR不适用于Postgres 8.3中的数据类型“timestamp”

我在postgres中遇到了下面的查询问题
SELECT u.username,l.description,l.ip,SUBSTRING(l.createdate,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,11) >= '2009-06-07'
    AND SUBSTRING(l.createdate,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,...
                                             ^
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.**

我假设它与数据类型有关,数据是一个时区,而substring只支持字符串数据类型,现在我的问题是我可以对我的查询做些什么,以便我的结果出现?

您的问题的显式解决方案是将日期时间转换为字符串.

…,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;

或者下面的替代方案之一(你应该接受而不是这个.)

相关文章

来源:http://www.postgres.cn/docs/11/ 4.1.1.&#160;标识符和关键词 SQL标识符和关键词必须以一个...
来源:http://www.postgres.cn/docs/11/ 8.1.&#160;数字类型 数字类型由2、4或8字节的整数以及4或8...
来源:http://www.postgres.cn/docs/11/ 5.1.&#160;表基础 SQL并不保证表中行的顺序。当一个表被读...
来源:http://www.postgres.cn/docs/11/ 6.4.&#160;从修改的行中返回数据 有时在修改行的操作过程中...
来源:http://www.postgres.cn/docs/11/ 13.2.1.&#160;读已提交隔离级别 读已提交是PostgreSQL中的...
来源:http://www.postgres.cn/docs/11/ 9.7.&#160;模式匹配 PostgreSQL提供了三种独立的实现模式匹...