我在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';
Run Code Online (Sandbox Code Playgroud)
我总是在较旧版本的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.**
Run Code Online (Sandbox Code Playgroud)
我假设它与数据类型有关,数据是一个时区,而substring只支持字符串数据类型,现在我的问题是我可以对我的查询做些什么,以便我的结果出现?
您的问题的显式解决方案是将日期时间转换为字符串.
...,SUBSTRING(l.createdate :: VARCHAR,...
现在,使用结果比较日期并不是一个好习惯.
因此,您需要的最佳解决方案是使用显式日期时间操作,比较和格式化函数(如extract()和to_char())更改查询
你必须改变你的查询才能有一个像这样的子句
l.createdate::DATE >= '2009-06-07'::DATE
AND l.createdate::DATE < '2009-07-08'::DATE;
Run Code Online (Sandbox Code Playgroud)
或者下面的替代方案之一(你应该接受而不是这个.)
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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
15255 次 |
| 最近记录: |